转自:http://www.cnblogs.com/ulex/p/4186881.html
IOC容器:工具较多,大体功能都相同,大都需要事先对接口与实现进行配对(通过代码或配置文件),然后由系统自动或手动通过接口来获得相应实现类的实例,对象实例化的工作由IOC容器自动完成。
概述:MEF :Managed Extensibility Framework(MEF)是.NET平台下的一个扩展性管理框架,他是一系列特性的集合,包括依赖注入等。
解决的问题:
1.MEF为宿主应用提供了一种标准的途径来暴露自身并使用外部扩展。
2.而扩展本身是可以被不同的应用程序所使用的。、
3.而一个扩展依旧可以通过针对特定应用的方法来实现。扩展之间也可以存在依赖关系,MEF则会自动将它们按照正确的顺序进行调用。
工作原理:
MEF的核心包括一个catalog 和一个CompositionContainer. catalog用于发现扩展,而container 用于协调创建和梳理依赖性。每个可组合的Part提供了一个或多个Export,并且通常依赖于一个或多个外部提供的服务或Import。
每个Part管理一个实例为应用程序运行。
MEF 提供一种通过“组合”隐式发现组件的方法。 MEF 组件(称为“部件-Part”)。部件以声明方式同时指定其依赖项(称为“导入-Import”)及其提供的功能(称为“导出-Export”)。MEF 原理上很简单,找出有共同接口的导入、导出。然后找到把导出的实例化,赋给导入。说到底MEF就是找到合适的类实例化,把它交给导入。
如何声明一个部件-导入与导出
导出是部件向容器中的其他部件提供的一个值,而“导入”是部件向要通过可用导出满足的容器提出的要求。
在特性化编程模型中,导入和导出是由修饰类或成员使用 Import 和Export 特性声明的。
ExPort特性类、字段、属性或方法,而 Import 特性可修饰字段、属性或构造函数参数。为了使导入与导出匹配,导入和导出必须具有相同的协定。
例子:
假设有一个类MyClass,它声明了可以导入插件的类型是IMyAddin。
public class MyClass { [Import] public IMyAddin MyAddin { get; set; } }这里有一个类,它声明为导出。类型同样为IMyAddin
[Export(typeof(IMyAddin))] public class MyLogger : IMyAddin { } 这样我们使用MyAddin属性的时候就可以获得到MyLogger的实例。 发现部件
MEF提供三种方式发现部件
- AssemblyCatalog 在当前程序集发现部件。
- DirectoryCatalog 在指定的目录发现部件。
- DeploymentCatalog 在指定的XAP文件中发现部件(用于silverlight)
当通过不同方式发现部件的时候,还可以使用AggregateCatalog来把这些部件聚合到一起。
var catalog = new AggregateCatalog(); //把从Program所在程序集中发现的部件添加到目录中 catalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly)); //把从指定path发现的部件添加到目录中 catalog.Catalogs.Add(new DirectoryCatalog("C:\\Users\\v-rizhou\\SimpleCalculator\\Extensions"));