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

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

MEF核心笔记

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

先上效果图

一、新建解决方案

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

如图:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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);
            }
             
        }

  

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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就是插件目录,所有插件都放到这个目录下

1
2
3
4
5
public Form1()
        {
            InitializeComponent();
            Init();
        }

  

二、新建接口类库PluginInterface

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

再新建一个接口IPlugin

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

  

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

需要引用System.ComponentModel.Composition

1
2
[ImportMany]
        public IEnumerable<IPlugin> plugins;

  

三、新建插件类库

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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下载

作者:李子深
声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!

如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。

[转][MEF插件式开发] 一个简单的例子的更多相关文章

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

    偶然在博客园中了解到这种技术,顺便学习了几天. 以下是搜索到一些比较好的博文供参考: MEF核心笔记 <MEF程序设计指南>博文汇总 先上效果图 一.新建解决方案 开始新建一个解决方案Me ...

  2. MEF 插件式开发 - 小试牛刀

    原文:MEF 插件式开发 - 小试牛刀 目录 MEF 简介 实践出真知 面向接口编程 控制反转(IOC) 构建入门级 MEF 相关参考 MEF 简介 Managed Extensibility Fra ...

  3. MEF 插件式开发 - WPF 初体验

    原文:MEF 插件式开发 - WPF 初体验 目录 MEF 在 WPF 中的简单应用 加载插件 获取元数据 依赖注入 总结 MEF 在 WPF 中的简单应用 MEF 的开发模式主要适用于插件化的业务场 ...

  4. MEF 插件式开发之 小试牛刀

    MEF 简介 Managed Extensibility Framework 即 MEF 是用于创建轻量.可扩展应用程序的库. 它让应用程序开发人员得以发现和使用扩展且无需配置. 它还让扩展开发人员得 ...

  5. 【UI插件】开发一个简单日历插件(上)

    前言 最近开始整理我们的单页应用框架了,虽然可能比不上MVVM模式的开发效率,也可能没有Backbone框架模块清晰,但是好歹也是自己开发出来 而且也用于了这么多频道的东西,如果没有总结,没有整理,没 ...

  6. MEF 插件式开发之 DotNetCore 中强大的 DI

    背景叙述 在前面几篇 MEF 插件式开发 系列博客中,我分别在 DotNet Framework 和 DotNet Core 两种框架下实验了 MEF 的简单实验,由于 DotNet Framewor ...

  7. MEF 插件式开发之 DotNetCore 初体验

    背景叙述 在传统的基于 .Net Framework 框架下进行的 MEF 开发,大多是使用 MEF 1,对应的命名空间是 System.ComponentModel.Composition.在 Do ...

  8. MEF 插件式开发之 WPF 初体验

    MEF 在 WPF 中的简单应用 MEF 的开发模式主要适用于插件化的业务场景中,C/S 和 B/S 中都有相应的使用场景,其中包括但不限于 ASP.NET MVC .ASP WebForms.WPF ...

  9. 零基础ASP.NET Core MVC插件式开发

    零基础ASP.NET Core MVC插件式开发 一个项目随着业务模块的不断增加,系统会越来越庞大.如果参与开发的人员越多,管理起来也难度也很大.面对这样的情况,首先想到的是模块化插件式开发,根据业务 ...

随机推荐

  1. 图灵机(转自wiki)

    图灵机(英语:Turing machine),又称确定型图灵机,是英国数学家艾伦·图灵于1936年提出的一种抽象计算模型,其更抽象的意义为一种数学逻辑机,可以看作等价于任何有限逻辑数学过程的终极强大逻 ...

  2. C. Coin Troubles 有依赖的背包 + 完全背包变形

    http://codeforces.com/problemset/problem/283/C 一开始的时候,看着样例不懂,为什么5 * a1 + a3不行呢?也是17啊 原来是,题目要求硬币数目a3 ...

  3. Hadoop Hive概念学习系列之hive的索引及案例(八)

    hive里的索引是什么? 索引是标准的数据库技术,hive 0.7版本之后支持索引.Hive提供有限的索引功能,这不像传统的关系型数据库那样有“键(key)”的概念,用户可以在某些列上创建索引来加速某 ...

  4. offset家族基本简介

    Offset家族简介 offset这个单词本身是--偏移,补偿,位移的意思. js中有一套方便的获取元素尺寸的办法就是offset家族: offsetWidth和offsetHight 以及offse ...

  5. 个人软件过程(psp)需求分析

    个人软件过程(psp)需求分析 1.  引言 1.1  背景 开发项目进度计划不准确,延期经常出现,甚至无法给出一个比较准确的延迟时间,给市场推广带来很大麻烦. 2.  任务概述 2.1 目标 PSP ...

  6. Android显示相册图片和相机拍照

    首先看最重要的MainActive类: public class MainActivity extends AppCompatActivity { private final int FROM_ALB ...

  7. 如何把mysql的列修改成行显示数据简单实现

    如何把mysql的列修改成行显示数据简单实现 创建测试表: 1: DROP TABLE IF EXISTS `test`; 2: CREATE TABLE `test` ( 3: `year` int ...

  8. 外观模式(Facade)-子系统的协作与整合-接口模式

    对子系统进行整合,对外提供更强大或更便捷的接口. 在一个模块和几个子系统进行通信时考虑. 什么是外观模式? 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口 ...

  9. day16-常用模块I(time、datetime、random、os、sys、json、pickle)

    目录 time模块 datetime模块 random模块 os模块 sys模块 json模块与pickle模块 json pickle time模块 time模块一般用于不同时间格式的转换,在使用前 ...

  10. dom4j使用方法详解

    本文先做知识点的简单介绍,最后附完整案例. 一.解析XML文件 public class Foo { //url为XML文档地址 //自己封装了一个工具类 返回解析完成的document public ...