原文:【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. Hibernate中Session.get()方法和load()方法的详细比较

    一.get方法和load方法的简易理解  (1)get()方法直接返回实体类,如果查不到数据则返回null.load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用 ...

  2. Unix操作系统监控详解(一)

    一.描述 监控在检查系统问题运行状况以及优化系统性能工作上是一个不可缺少的部分.通过操作系统监控工具监视操作系统资源的使用情况,间接地反映了各服务器程序的运行情况.根据运行结果分析可以帮助我们快速定位 ...

  3. 【爬坑】Python 3.6 在 Socket 编程时出现类型错误 TypeError: a bytes-like object is required, not 'str'

    1. 问题描述 Python 3.6 在 Socket 编程时出现错误如下 Traceback (most recent call last): File "F:/share/IdeaPro ...

  4. Android高级_第三方下载工具Volley

    Volley下载主要应用于下载文本数据和图片数据两个方向,下面分别介绍: 一.使用Volley开启下载,首先要做的是导包和添加权限: (1)在build.gradle文件中导入依赖包:compile ...

  5. Linux运维之——每日小技巧,谈进程与线程的区别

    线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源. ...

  6. 乘风破浪:LeetCode真题_037_Sudoku Solver

    乘风破浪:LeetCode真题_037_Sudoku Solver 一.前言 这次我们对于上次的模型做一个扩展并求解. 二.Sudoku Solver 2.1 问题 2.2 分析与解决     这道题 ...

  7. myeclipse10无法weblogic10.3的问题解决方案

    在完成了myec与wl10的基本配置后,启动报如下错误 Parsing Failure in config.xml: java.lang.AssertionError: java.lang.Class ...

  8. Invalid action class configuration that references an unknown class named [XX] .

    多次遇到这个错误,难以解决,有时候出现,有时候没有,很神奇,今天发现了一点端倪,虽然说不上找到了所有导致这个bug的原因.至少,也是很主要的一种了. 其实,透过结果,如果debug用心,一行代码一行代 ...

  9. SAP客户端 测试机、开发机、生产机

     SAP客户端 测试机.开发机.生产机     客户端(即Client),是SAP组织架构里最高层的组织单元,所有数据,包括静态数据(科目.客户.供应商.物料.资产等).业务数据(采购订单.销售订单. ...

  10. 【转】 [置顶] Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)

    在Android的应用层中,涉及到很多应用框架,例如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏框架,通知机制,ActionBar框架等等. ...