zoukankan      html  css  js  c++  java
  • 【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框架,这还远远不够,或许您需要Prism框架.最后,如果您有更好的建议,请留言,感激不尽!

  • 相关阅读:
    UFLDL深度学习笔记 (四)用于分类的深度网络
    UFLDL深度学习笔记 (三)无监督特征学习
    UFLDL深度学习笔记 (二)SoftMax 回归(矩阵化推导)
    UFLDL深度学习笔记 (一)反向传播与稀疏自编码
    【2016内推】计算机找工作面经
    关于最优化中的若干问题
    关于extern "C" 的用法
    浅谈多核CPU、多线程、多进程
    并发与并行
    多进程与多线程
  • 原文地址:https://www.cnblogs.com/caizl/p/4509333.html
Copyright © 2011-2022 走看看