• [MEF插件式开发] 一个简单的例子


    偶然在博客园中了解到这种技术,顺便学习了几天。

    以下是搜索到一些比较好的博文供参考:

    MEF核心笔记

    《MEF程序设计指南》博文汇总

    先上效果图

    一、新建解决方案

    开始新建一个解决方案Mef,再添加一个winform项目为:MefDemo

    如图:

    打开Form1窗口,拉入MenuStrip菜单控件,把name改名为"ms",菜单控件什么菜单都不加,如下图:

     

    接着双击窗口写如下代码:

    private void Form1_Load(object sender, EventArgs e)
            {
                
                ToolStripMenuItem item = new ToolStripMenuItem("插件");
                ms.Items.Add(item);
                foreach (IPlugin plugin in plugins)
                {
                    ToolStripMenuItem subItem = new ToolStripMenuItem(plugin.Text);
                    subItem.Click += (s, arg) => { plugin.Do(); };
                    item.DropDownItems.Add(subItem);
                }
                
            }
    

      

    在继续写一个初始化插件代码:

    private CompositionContainer _container;
            private void Init()
            {
                //设置目录,让引擎能自动去发现新的扩展
                var catalog = new AggregateCatalog();
                catalog.Catalogs.Add(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory+"plugin\"));
    
                //创建一个容器,相当于是生产车间
                _container = new CompositionContainer(catalog);
    
                //调用车间的ComposeParts把各个部件组合到一起
                try
                {
                    this._container.ComposeParts(this);//这里只需要传入当前应用程序实例就可以了,其它部分会自动发现并组装
                }
                catch (CompositionException compositionException)
                {
                    Console.WriteLine(compositionException.ToString());
                }
            }
    

      

    Form1构造函数加入Init方法,程序刚启动时会从运行目录下plugin目录搜索所有dll文件并加载,plugin就是插件目录,所有插件都放到这个目录下

    public Form1()
            {
                InitializeComponent();
                Init();
            }
    

      

    二、新建接口类库PluginInterface

    现在来创建一个接口项目(PluginInterface),它就像数据线或电源线一样,一端连接终端(手机、电脑),一端插到插座(电脑USB接口、插排),完全可以相像一下,手机在电脑充电的情形(它就需要一条数据线,一端连手机,一端连电脑)。

    再新建一个接口IPlugin

    public interface IPlugin
        {
            string Text { get; } //插件名称
            void Do(); //动作
        }
    

      

    现在回到主程序,打开Form1窗口,写上如下代码:

    需要引用System.ComponentModel.Composition

    [ImportMany]
            public IEnumerable<IPlugin> plugins;
    

      

    三、新建插件类库

    现在可以来开发一个插件,为了方便,我在同一解决方案下创建,创建了一个Plugin1类库

    再类库下新建一个类MyPlugin并实现IPlugin,有一点要注意,需要把MyPlugin命名空间改成和主程序一样

    namespace MefDemo
    {
        [Export(typeof(IPlugin))]
        public class MyPlugin:IPlugin
        {
            public string Text
            {
                get { return "插件1"; }
            }
    
            public void Do()
            {
                MessageBox.Show(Text);
            }
        }
    }
    

      

    同样的方法再创建2个插件类库,分别是Plugin2、Plugin3(winform)

    插件类库编译后,复制dll到主程序plugin目录下

    Demo下载

  • 相关阅读:
    最短路-dij
    链式前向星
    B树、B+树
    C++类
    差分约束
    数位DP
    Markdown编辑器:表格
    git使用笔记
    leetcode 162. 寻找峰值(二分)
    python matplotlib包的安装注意事项:报错——No such file or dir : tmp/matplotlib-xxxxxx
  • 原文地址:https://www.cnblogs.com/shensigzs/p/5534548.html
Copyright © 2020-2023  润新知