原文:【MEF】构建一个WPF版的ERP系统

引言

MEF是微软的一个扩展性框架,遵循某种约定将各个部件组合起来.而ERP系统的一大特点是模块化,它们两者的相性很好,用MEF构建一个ERP系统是相当合适的.下面简单演示如何构建一个简单版的ERP系统.

简单分析

从框架的角度来看,一个好的ERP系统应该至少具备以下两个特点:

1.模块开发.一个大型ERP系统要靠团队开发的,每个人负责的模块可能都不一样,要保证低耦合和开发进度,每个模块必须要能够独立开发测试,最终才组合起来.

2.实时更新.ERP系统的模块经常会有功能性修改,升级频繁,要保证良好的体验,不能每次都要用户重新打开系统更新,我们需要实现后台更新,悄悄用新的模块替换旧的模块.

 主程序

新建一个WPF项目,添加引用System.ComponentModel.Composition,然后就可以设计开发了.

界面设计,listbox用来显示所有模块列表,双击模块名可以打开模块.而刷新按钮模拟实时更新,如下:

实现代码,Compose方法负责将所有有导出特性的dll加载到容器中,窗体的构造方法和刷新按钮都会调用此方法,代码如下

        private void Compose()
{
AggregateCatalog Catalog = new AggregateCatalog(); //catalog = new DirectoryCatalog("Modules");
//Catalog.Catalogs.Add(catalog); DirectoryInfo dlldirectory = new DirectoryInfo("Modules"); FileInfo[] fileinfo = dlldirectory.GetFiles(); foreach (FileInfo item in fileinfo)
{
if (item.Extension== ".dll")
{
//不采用DirectoryCatalog加载,而采用AssemblyCatalog加载程序集,是为了能够在程序运行时删除dll和更新dll.
Assembly assembly = Assembly.Load(File.ReadAllBytes(item.FullName));
Catalog.Catalogs.Add(new AssemblyCatalog(assembly));
}
}
container = new CompositionContainer(Catalog);
// container.ComposeParts(this); this.modulelist.ItemsSource = container.GetExports<UserControl, IDictionary<string, object>>().Select(x => x.Metadata["name"]).ToList();
}

listbox双击事件方法,如下

private void modulelist_MouseDoubleClick_1(object sender, MouseButtonEventArgs e)
{
if (this.modulelist.SelectedItem == null)
{
return;
}
string modulename = (string)this.modulelist.SelectedItem;
Lazy<UserControl, IDictionary<string, object>> tmp = container.GetExports<UserControl, IDictionary<string, object>>().Where(x => (string)x.Metadata["name"] == modulename).FirstOrDefault();
Window win = new Window();
win.Height = ;
win.Width = ;
win.Content = tmp.Value;
win.Owner = this;
win.Show();
}

模块开发

新建一个WPF用户控件项目,添加用户控件ViewOne,再加上导出特性,代码如下

    [Export(typeof(UserControl))]
[PartCreationPolicy(CreationPolicy.NonShared)]
[ExportMetadata("name","viewone")]
public partial class ViewOne : UserControl
{
public ViewOne()
{
InitializeComponent();
// Console.WriteLine("viewone"+DateTime.Now.ToLongTimeString());
}
}

同样的方式可以创建多个模块,在此,我创建了模块一和模块二,还有一个修改过的模块二,共有3个dll.

模块组合演示

在主程序的exe的目录下新建一个文件夹Modules,将模块一和模块二的dll复制到里面,启动程序,打开模块一和模块二,我们就会看到

现在,我们可以将修改过的模块二dll替换掉原来的,按下刷新,打开模块二看看,它已经变成新的模块了

小结

本文简单地演示如何用MEF实现模块化开发和实时更新,如果要构建一个完整的ERP框架,这还远远不够,或许您需要Prism框架.最后,如果您有更好的建议,请留言,感激不尽!

【MEF】构建一个WPF版的ERP系统的更多相关文章

  1. .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”

    FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...

  2. 构建一个java环境的centos系统镜像并上传到阿里云镜像仓库

    编辑dockerfile 文件 FROM centos MAINTAINER zhaoweifeng ENV LANG en_US.UTF-8 RUN /bin/cp /usr/share/zonei ...

  3. 数据是ERP系统搭建的基础,但,不要让数据毁了ERP

    很难想象没有数据的ERP是什么样子的.然而,实际情况又是如何的呢? 根据AMT的研究,在那些上线不成功或者上线后掉线的案例中,有高达70%的项目都有一个共同的直接原因,那就是在数据上出了问题.有的是在 ...

  4. 如何发挥ERP系统中的财务监控职能?

    ERP系统的管理理念与特点 ERP,是整合了企业管理理念.业务流程.基础数据.人力物力.计算机硬件和软件于一体的企业资源管理系统.ERP系统运用信息技术将企业的资金流.物资流.信息流进行有效的集成,使 ...

  5. 构建一个完整的DNS系统

    人心不同 各如其面 如之奈何 如之奈何 ——引子   我们的目标很明了——构建一个具有根的.私有的DNS(Domain Name System). 这里不会陈述太多关于DNS与BIND的基础知识,如果 ...

  6. 【翻译】DotNetMQ: 一个.NET版完整的消息队列系统

    在一个大型的分布式系统中,消息队列是不可缺少的中间件,能很好的解决异步消息.应用解耦.均衡并发等问题.在.net中,偶然发现一个效率不错.安全可靠.功能齐全的消息组件,忍不住翻译过来,供大家快速预览. ...

  7. 构建一个简单的Linux系统 MenuOs —— start_kernel到init进程(20135304刘世鹏)

    构建一个简单的Linux系统 MenuOs —— start_kernel到init进程 作者:刘世鹏20135304 <Linux内核分析>MOOC课程http://mooc.study ...

  8. 第三周——构建一个简单的Linux系统MenuOS

    [洪韶武 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ] 第三周  构建一个 ...

  9. 全面具体介绍一个P2P网贷领域的ERP系统的主要功能

        一般的P2P系统,至少包含PC站点的前端和后端.前端系统的功能.能够參考"P2P系统哪家强,功能事实上都一样" http://blog.csdn.net/fansunion ...

随机推荐

  1. React Native中的约束规范

    参考资料:https://github.com/sunyardTime/React-Native-CodeStyle 感谢情书哥无私奉献 ##一.编程规约 ###(一) 命名规约 [强制] 代码中命名 ...

  2. Android 开源库和项目 3

    Android 开源库和项目 Android 开源库和项目 2 1.Matisse Android 图片选择器 -- 知乎开源 github 地址:https://github.com/zhihu/M ...

  3. springboot 1.3.5升级1.5.9后 默认使用tomcat 8.5版本 get请求报400 异常信息为 The valid characters are defined in RFC 7230 and RFC 3986

    1.springboot 1.3.5升级1.5.9后 默认使用tomcat 8.5版本而之前用的是tomcat7    get请求报400 异常信息为 The valid characters are ...

  4. 对WebSocket技术的学习与探索(二)

    近日重新开始学习WebSocket技术,什么是WebSocket,在<对WebSocket技术的学习与探索(一)>文章中已经说明白了,还没理解可以看看这篇文章http://www.ruan ...

  5. centos安装pip3

    安装pip3 1:安装依赖 yum install openssl-devel -y yum install zlib-devel -y 2:安装setuptools wget --no-check- ...

  6. 文科妹学 GitHub 简易教程

      #什么是 Github ?必须要放这张图了!!!<img src="https://pic4.zhimg.com/7c9d3403bf922b1663f56975869c829b_ ...

  7. c#WebApi使用form表单提交excel,实现批量写入数据库

    思路:用户点击下载模板按钮,获取到excel模板,然后向里面填写数据保存.from表单提交的时候选择保存好的excel,实现数据的批量导入过程 先把模板放在服务器的项目目录下面:如 模板我一般放在:F ...

  8. ConcurrentModificationException探究

    modCount ? 在ArrayList,LinkedList,HashMap等等的内部实现增,删,改中我们总能看到modCount的身影,modCount字面意思就是修改次数 // HashMap ...

  9. TiDB数据库 mydumper与loader导入数据

    从mysql导出数据最好的方法是使用tidb官方的工具mydumper. 导入tidb最好的方法是使用loader工具,大概19.4G每小时的速度. 详细的步骤可以参考官网:https://pingc ...

  10. windows Server 2012/2016 路由和远程访问,PPPOE,ADSL,连接接口时出现一个错误,连接被远程计算机终止

    经过查询资料,是由mprddm.dll的bug引起的. 修改位置: 将je修改为jmp. 查找修改位置,可参考 前面的RasGetPortUserData的调用,或者 后面的 字符串 64位dll可使 ...