前面一个博客:也来学学插件式开发中很多朋友留言说可以用MEF来实现。于是我就试着用MEF实现了一下。

步骤和上一篇差不多,只是加载插件的方式有所不同。这只是一个自己的示例程序,肯定有很多不足之处,欢迎拍砖。

MEF如何工作?

MEF主要是通过Import与Export特性来定义导入与导出部件。程序在运行的时候会将具有相同接口的导出的实例化,赋给导入。

MEF程序设计指南一:在应用程序中宿主MEF这篇文章有一个简单的MEF例子,大家可以参考一下。

所以,在这里,插件就是导出,我们在程序中要定义具有和插件相同接口的导入。

但是这里有一个问题,一般的导入与导出是一对一的,但我们的工具箱中和插件的关系明显是一对多的怎么办?

没问题,MEF对于这种情况可以将导入声明为ImportMany,这样就支持一个导入对应多个导出了。

关于ImportMany可参见:http://msdn.microsoft.com/en-us/library/dd460648.aspx#further_imports_and_importmany

因此这里,我用ImportMany来定义一个集合来保存插件:

        [ImportMany]public IEnumerable<Iplugin> plugins;

如何让MEF发现插件?

我们用反射的时候是将插件放置在一个固定的目录中,然后再去扫描这个目录来发现插件,在MEF中如何来发现插件呢?

MEF提供三种方式发现部件:

  1. AssemblyCatalog 在当前程序集发现部件。
  2. DirectoryCatalog 在指定的目录发现部件。
  3. DeploymentCatalog 在指定的XAP文件中发现部件(用于silverlight)

可以看到,我们也可以将插件放在统一的目录让MEF去检索发现。

使用MEF

使用MEF的时候,首先要初始化MEF的组合容器对象:CompositionContainer,所以在窗体加载的时候要做好初始化工作。

        public ToolBox(){InitializeComponent();Init();}private CompositionContainer _container;private void Init(){//An aggregate catalog that combines multiple catalogsvar catalog = new AggregateCatalog();//设置目录catalog.Catalogs.Add(new DirectoryCatalog(Application.StartupPath + "\\plugin\\"));//Create the CompositionContainer with the parts in the catalog_container = new CompositionContainer(catalog);//Fill the imports of this objecttry{this._container.ComposeParts(this);}catch (CompositionException compositionException){Console.WriteLine(compositionException.ToString());}}

接着就是发现插件后的显示工作了:

        private void ToolBox_Load(object sender, EventArgs e){InitPlugin();}[ImportMany]public IEnumerable<Iplugin> plugins;public void InitPlugin(){foreach (Iplugin plugin in plugins){InitModule(plugin);}}

增加插件

我们来新增一个插件试试。新建一个类库项目,再增加一个Window窗体,拉一个PictureBox,显示一张图片。主要的工作是我们要定义导出:Export

   [Export(typeof(PluginMain.Interface.Iplugin))]public class App:PluginMain.Interface.Iplugin{public System.Windows.Forms.Form MainForm{get { return new Picture(); }}public System.Drawing.Image ModulePicture{get { return null; }}}

将生成的.DLL放在plugin目录中。生成后效果如图:

示例代码下载:点我

参考资料:【.Net平台下插件开发】-MEF与MAF初步调研

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

Managed Extensibility Framework (MEF)

如果我的文章对你有帮助,就点一下推荐吧.(*^__^*)

也来学学插件式开发续-利用MEF相关推荐

  1. 基于AppDomain的插件式开发

    很多时候,我们都想使用(开发)USB式(热插拔)的应用,例如,开发一个WinForm应用,并且这个WinForm应用能允许开发人员定制扩展插件,又例如,我们可能维护着一个WinService管理系统, ...

  2. .net 插件式开发学习总结

    .NET简谈插件系统开发模式 今天跟大家分享一下我们在日常开发中并不常用的开发模式"插件系统模式",什么叫插件从大一点的概念讲就是我们开发的软件是由很小的模块组成,每一块都能成功的 ...

  3. C\S结构的插件式开发思想以及向B\S结构的架构延伸(二)

    忙碌的好多天过去了,自从上一贴发出后,不少同仁都对插件式开发提出了自己的看法以及分享一些插件式开发比较典型的例子,感谢李锋.肖明等 同仁的分享,也感谢所有顶贴的同志,今天来分享一下插件式开发著名的产品 ...

  4. 【大话QT之四】ctkPlugin插件系统实现项目插件式开发

    插件式开发体会: 自开始写[大话QT]系列就开始接触渲染客户端的开发,说是开发不如更多的说是维护以及重构,在接手这块的东西之前自己还有点犹豫,因为之前我一直认为客户端嘛,没什么技术含量,总是想做比较有 ...

  5. ctkPlugin插件系统实现项目插件式开发

    插件式开发体会: 自开始写[大话QT]系列就开始接触渲染客户端的开发,说是开发不如更多的说是维护以及重构,在接手这块的东西之前自己还有点犹豫,因为之前我一直认为客户端嘛,没什么技术含量,总是想做比较有 ...

  6. 从零开始实现ASP.NET Core MVC的插件式开发(五) - 插件的删除和升级

    标题:从零开始实现ASP.NET Core MVC的插件式开发(五) - 使用AssemblyLoadContext实现插件的升级和删除 作者:Lamond Lu 地址:https://www.cnb ...

  7. 从零开始实现ASP.NET Core MVC的插件式开发(四) - 插件安装

    标题:从零开始实现ASP.NET Core MVC的插件式开发(四) - 插件安装 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11343141. ...

  8. 从零开始实现 ASP.NET Core MVC 的插件式开发(九) - 如何启用预编译视图

    标题:从零开始实现 ASP.NET Core MVC 的插件式开发(九) - 升级.NET 5及启用预编译视图 作者:Lamond Lu 地址:https://www.cnblogs.com/lwql ...

  9. 从零开始实现 ASP.NET Core MVC 的插件式开发(七) - 问题汇总及部分问题解决方案...

    标题:从零开始实现 ASP.NET Core MVC 的插件式开发(七) - 问题汇总及部分问题解决方案 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/ ...

最新文章

  1. 计算机组成与结构实验箱,HQFC-B1计算机组成和数字电路实验箱
  2. 电脑睡眠快捷键_电脑快速进入睡眠的快捷键是什么?
  3. js获取checkbox值的方法
  4. 为啥linux分区是nvme0n1,NAS 篇五:尝试达成最终目标: 黑裙+万兆网卡+Nvme 存储空间的实现与测试...
  5. 信息学奥赛C++语言:的士收费
  6. VHDL常用操作符介绍
  7. 苹果挖迪士尼墙脚:喜获视频服务总监
  8. java中service设计_JDBC中DAO+service设计思想
  9. Java基础知识框图总结
  10. python 数据呈现_新手小白初学Python数据可视化 清晰呈现数据变化
  11. tomcat通过虚拟路径访问外部静态资源
  12. WiFi图标在任务栏里不见了,提示:适配器Qualcomn Atheros QCA9377 Wireless Network Adapter遇到驱动程序或硬件相关的问题
  13. 【资源分享】一款bootstrap开发的后台管理系统前端模板
  14. Docker安装ElasticSearch 版本7.6.2
  15. html设置word页脚,Word页码从任意页开始如何设置?
  16. 手把手教你找回学信网原来的登记手机号码
  17. HTML设置圆角头像,圆角头像的制作
  18. 笔记本(只有一个HDMI接口)接双屏的方案(谨慎使用)
  19. 搭建K8S 的dashboard的坑the server could not find the requested resource
  20. OAM 与 KubeVela:下一代云原生应用交付和管理实践

热门文章

  1. 禅道 mysql 远程连接_远程访问禅道开源版数据库(基于docker)
  2. maven的pom文件出现Multiple annotations found at this line...,已解决
  3. c语言c程序由函数构成 每个函数完成相对独立的功能,17秋学期(1709)《C语言程序设计》在线作业  满分...
  4. 属性数量限制android,Android开发笔记 今天学到的一些属性
  5. toad for mysql 乱码_Toad for mysql乱码解决办法
  6. 古筝d调变降e调怎么办_问:古筝k是什么意思
  7. spring如何下载源码和jar包
  8. 谷歌AI为达目的,把自己的身体改造成了这样……
  9. 京东发布全球物流无人机研报:美国领先、非洲政策最开放,中国产业链全景最复杂...
  10. 《2001太空漫游》50周年:一部电影和一整个时代