【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 = 200;
            win.Width = 300;
            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框架,这还远远不够,要完善很多细节.最后,如果您有更好的建议,请留言,感激不尽!

时间: 2024-10-10 01:11:20

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

zookeeper学习系列:三、构建一个分布式master、slave系统

之前只理解zk可以做命名,配置服务,现在学习下他怎么用作构建master-slave模式的分布式系统. 为什么叫Zoo?“因为要协调的分布式系统是一个动物园”. ZooKeeper是一个中性化的Service,用于管理配置信息.命名.提供分布式同步,还能组合Service.所有这些种类的Service都会在分布式应用程序中使用到.每次编写这些Service都会涉及大量的修bug和竞争情况.正因为这种编写这些Service有一定难度,所以通常都会忽视它们,这就使得在应用程序有变化时变得难以管理应用

为什么 ERP 系统的用户体验不好?

(本人原创,非首发文,谢绝转载) 最有资格回答这个问题的人到底是谁?客户?用户?程序员?软件销售人员?客观公正的第三方-- 每个人都带着自己的利益诉求,每个人都有自己的职业偏见,每个人都有自己的眼界局限.很难说可以得到一个大一统的答案,尽管如此,答主也尝试回答一下,不吐不快啊. 答主的背景: 工作年限不短了,使用过较早的ERP系统,IBM的AS400,一台主机,几十台终端那种小型机电脑,磁带机存储,但是惭愧这个电脑上运行的ERP软件名称是什么就不记得了.后面各类基于网络的在服务器上运行服务端和P

码农的视角:马云菜鸟物流的一个简洁版实现

龟兔赛跑的物流玄机 80后的我们大都接受了一个励志的寓言故事:龟兔赛跑.这个寓言有很多版本,有的说兔子太骄傲,在比赛的时候睡大觉,结果被乌龟给拼命地赢了.有的说,乌龟很聪明,在比赛的路上不满了同伴,每个同伴看到兔子来,就开始跑,结果乌龟聪明地赢了兔子. 龟兔赛跑的第二个版本,充满了物流玄机:假如一个用户在XX地方买了一个商品,那什么样才能更快地把商品送到该用户手中.用龟兔聪明的版本,就是在离用户近的地方,先合理准备着该商品. 其实这个从技术的角度来看可以说是CACHE,或者说CDN,其架构图如下

谈谈企业是否适合部署全球ERP系统的原因

几乎所有规模的组织都在使用某些软件系统来集成和控制各种业务操作.此外,随着企业通过并购.合资等进行扩张,他们倾向于开始处理大量的系统,因为这些系统均已到位.当然,挑战在于将这些系统或来自这些系统的数据与总部操作系统集成.尽管人工整合两个或三个这样的系统来创建单一的业务概况并非不可逾越的任务,但随着业务的进一步扩大和此类"本地"工具数量的激增,开展此类业务会变得更复杂.更耗时和更昂贵.如果企业业务扩张导致在使用不同法律.税收制度和会计标准的多个国家设立了多个子公司,集成这些工具的任务将变

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

在一个大型的分布式系统中,消息队列是不可缺少的中间件,能很好的解决异步消息.应用解耦.均衡并发等问题.在.net中,偶然发现一个效率不错.安全可靠.功能齐全的消息组件,忍不住翻译过来,供大家快速预览. 注:原作者用windows服务启动消息队列服务,但是本人在win10上测试出错,可自行改成控制台启动消息队列服务,然后用第三方工具注册服务(如:SrvanyUI) 原文:http://www.codeproject.com/Articles/193611/DotNetMQ-A-Complete-M

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

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

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

构建一个简单的Linux系统 MenuOs —— start_kernel到init进程 作者:刘世鹏20135304 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核代码简介 内核源码三个个重要目录 arch占有代码量最大,支持不同cpu的源代码,arch/x86目录下的代码是我们关注的重点 init,内核启动相关的代码基本都在init目录下,init/main.c中start_kernel是整

一个超漂亮的Java版博客系统,内置14套皮肤,已经转化为标准的Eclipse项目,直接导入即可

原文:一个超漂亮的Java版博客系统,内置14套皮肤,已经转化为标准的Eclipse项目,直接导入即可 源代码下载地址:http://www.zuidaima.com/share/1550463745002496.htm MrZhao只分享精品,话不多说,直接上图      - 为了压缩文件我把WEB-INF下面的lib包打包放在网盘下载地址:http://pan.baidu.com/s/1hqqqWOc - 把lib解压进去以后项目直接导入Eclise即可运行 - 数据库Mysql,确保一个新

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

一般的P2P系统,至少包含PC站点的前端和后端.前端系统的功能.能够參考"P2P系统哪家强,功能事实上都一样" http://blog.csdn.net/fansunion/article/details/46817473.后端系统.之前我都把它看作是一个普通的"Web管理系统". 后来接触到北京专门做"类金融"系统的公司,他们的P2P后端,号称"ERP". 就总体功能而言,非常不错.支持4种业务模式.能够參考"P2