.Net插件编程模型:MEF和MAF
MEF和MAF都是C#下的插件编程框架,我们通过它们只需简单的配置下源代码就能轻松的实现插件编程概念,设计出可扩展的程序。这真是件美妙的事情!
MEF(Managed Extensibility Framework)
MEF的工作原理大概是这样的:首先定义一个接口,用这个接口来约束插件需要具备的职责;然后在实现接口的程序方法上面添加反射标记“[Export()]”将实现的内容导出;最后在接口的调用程序中通过属性将插件加载进来。我们还是用代码来描述吧:
1. 定义一个接口:
2. 实现定义的接口(部分一)
实现定义的接口(部分二)
分析:
标记“[Export(typeof(ICalculator))]”声明表达的意思是:这个类可以编译为插件,并能放入插件容器“ICalculator”中。这里需要注意的是:部分一和部分二的代码分布在不同的程序集中。导出的插件不一定必须是以类的形式,也可以是方法。
通过导出方法来生成插件:
插件的调用者:
分析:
标记“[ImportMany(typeof(ICalculator))]”,该声明表达的意图是:将所有声明了标记“[Export(typeof(ICalculator))]”的程序集加载进容器。这里“[ImportMany]和”[Import]”的区别就是:前者的容器可以存放多个插件,而后者只能存放一个。
光声明“[Import()]”和”[Export()]”标记是不行的,还必须通过下面的代码将这两个标记的功能联合起来:
执行结果
Name:+,number operands:2
Name:-,number operands:2
Name:*,number operands:2
Name:/,number operands:2
Operation?+
operand 1?
1
operand 2?
1
calling calculator
result:2
Operation?exit
you are dead!!!
|
MAF(Managed Addin Framework)
MAF也是.Net为我们提供的一个“插件编程”解决方案。它比MEF复杂,需要配置很多元素。但它也有些优点:1.宿主程序和插件程序可以进行隔离,以此降低运行插件所带来的风险;2。MAF的设计是基于7个程序集组成的管道,这些管道部分可以单独更换,这些管道的详细情况见下图。
图1
使用MAF是需要有些细节需要注意:组成管道的7个程序集在系统中的保存路径有格式要求,并且没个保存它的文件夹内只运行同时出现一个程序集。具体情况如下图所示:
图2
图3
图4
图5
下面我们来看一个小Demo吧,这个demo一共有7个项目,它们分别对应图1描述的管道中的7个部分。具体情况见下图。
图6
插件:Addin_1,Addin_2
插件视图:AddinSideView
插件适配器:AddinSideAdapter
协定:IContract
宿主视图:HostSideView
宿主适配器:HostSideAdapter
宿主程序:Host
|
程序代码
Addin_1
Addin_2
AddinSideView
AddinSideAdapter
IContract
HostSideView
HostSideAdapter
Host
分析
在上面的7个程序集,起解耦作用的关键还是2个适配器类。调用程序不直接调用协定,而是通过通过调用这2个适配器来间接调用协定。
小结
MEF和MAF为我们实现“插件编程”提供了2中选择,它们设计的出发点也是完全不同的。在使用它们的时候还是需要更加具体需求来权衡使用。
分享到:
相关推荐
基于MEF插件模型的demo,MAF见:http://download.csdn.net/detail/hotmee/9713170
微软MAF——Managed Add-in Framework; 微软MEF——Managed Extensibility Framework;...本资源含2个MAF示例程序和1个MEF示例程序,在VS2010和VS2017下均编译通过。学习插件开发框架的同学们,绝对物超所值。
实现了一个MEF可扩展框架的简易例子,可参考MEF是如何实现并工作的
Working through step-by-step exercises using P/LINQ, DLR, MEF, MVC, IronPython, Axum, and Ajax, you will learn a variety of approaches to building each of the key application tiers common to all web ...
掌握本技术的前提是会用MEF,可以参考我写的《.NET 4.0面向对象编程漫谈(应用篇)》第22章。与本资源相关的网页在我的个人博客上:http://blog.csdn.net/bitfan/article/details/17260775,技术问题可以在那儿交流...
MEF白皮书中文版 .NET框架4.0 版本包括了支持面向组件编程的类。 这些称为组合基元的最底层的类代表了: ● 具有相互组合能力的...使用CompositionContainer,包括.NET 框架,基于特性编程模型是一个完全组合的系统
使用Caliburn.Micro实现MEF插件化开发,根据dll插件目录动态加载程序集和主程序的Tab页。
使用MEF的即插即用服务 请参阅相关的博客文章
在wpf中使用MEF构建插件的一个demo。
引导程序 MEF Autofac应用程序引导程序
介绍.NET组件编程技术,包括自定义控件、混合语言开发与动态组件插拔
#加载项和可扩展性 货币基金组织MAF演示,Microsoft在Codeplex上有更多详细的演示#在MEF和MAF之间选择(System.AddIn) 问题:托管扩展框架(MEF)和托管加载项框架(MAF,又名System.AddIn)似乎完成了非常相似的...
#spike.mef.plugins 这是以下的示例项目。 有关启动的重要注意事项 客户端应用程序将C:/ external_plugins文件夹指定为插件位置插件必须从源代码构建,并与config.xml文件放置在单独的文件夹中。 config.xml文件...
一个很简单的MEF模型,实现了插件式开发。
使用 Asp.Net MVC 和 MEF 构建基于插件的 Web 应用程序的轻量级框架。 依赖关系 - 用于为 Beethoven 编写的主机开发/扩展插件的包 例子 - 使用 Beethoven 构建基于示例插件的 Web 应用程序 归因 贝多芬剪贴画 ( ) ...
MEF 让扩展不仅可在应用程序内重复使用,还可以跨程序重复使用。传统的 C/S 端开发,如果项目不是特别复杂,常规的开发模式还是可以应对的。但是一旦场景复杂度提升,一个小小业务功能的修改就需要更新整个客户端,...
插件式开发,MEF结合MVVMLight的简单应用。供大家参考
Mef demoMef demo