【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框架.最后,如果您有更好的建议,请留言,感激不尽!

转载于:https://www.cnblogs.com/caizl/p/4509333.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Managed Extensibility Framework(MEF)是 .NET Framework 和 .NET Core 中的一个插件化框架,可以帮助开发者实现可扩展的应用程序。MEF 框架在 .NET Core 中是自带的,不需要额外安装。 使用 MEF 框架实现插件化开发的步骤如下: 1. 创建插件接口 首先需要定义一个插件接口,该接口定义了插件的基本功能和方法。例如: ```csharp public interface IPlugin { string Name { get; } void Execute(); } ``` 2. 创建插件实现类 接着需要创建一个或多个实现插件接口的类。例如: ```csharp [Export(typeof(IPlugin))] public class Plugin1 : IPlugin { public string Name => "Plugin1"; public void Execute() { Console.WriteLine("Plugin1 executed."); } } [Export(typeof(IPlugin))] public class Plugin2 : IPlugin { public string Name => "Plugin2"; public void Execute() { Console.WriteLine("Plugin2 executed."); } } ``` 注意:实现类需要使用 `[Export]` 属性进行标记,表示该类是一个插件。 3. 创建主程序 创建主程序并使用 MEF 框架加载插件。例如: ```csharp class Program { static void Main(string[] args) { var catalog = new DirectoryCatalog("plugins"); // 插件目录 var container = new CompositionContainer(catalog); foreach (var plugin in container.GetExportedValues<IPlugin>()) { Console.WriteLine("Loaded plugin: " + plugin.Name); plugin.Execute(); } } } ``` 这段代码会从指定的插件目录中加载所有插件,并执行 `Execute` 方法。 注意:需要在主程序中添加对 `System.ComponentModel.Composition` 命名空间的引用,才能使用 MEF 相关的类。 这就是使用 MEF 框架实现插件化开发的基本步骤。在实际应用中,可以根据具体的需求进行更加复杂的插件实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值