MEF学习笔记--初步了解
MEF (Managed Extensibility Framework)
由于应用需求的变化频繁,导致应用软件可扩展性越做越差,很难加入新的功能.在NET4.0中,加入了MEF(托管可扩展框架)就为了解决了简化可扩展应用程序和组件的设计这个问题.
注意:
1.创建一个MEF Application时需要引用System.ComponentModel.Composition。
2.Compose()方法用于绑定对象到对应的接口。
3.MEF支持通过程序集或目录(DirectoryCatalog)或两者结合等方式绑定可扩展的对象。
4. 如果在新建CompositionContainer容器时,使用了DirectoryCatalog,则在该目标路径下的所有程序集都会被遍历查询,用于寻找实现Import接口的具体class。
当然,请在标记Export时使用[Export(typeof(接口))]来精确定位。
另外,通常使用时,我们需要使用一些特定的元数据(metadata)来进一步描述或说明某些特定接口(如果安全性,速度等)。我们可以使用PartMetadata标记class,使用ExportMetadata标记实现方法。
相关的关键概念:
• Composition(复合)是将几个带有不同功能的对象组合为一个或多个复杂对象的过程。复合不是从父类中继承功能,而是将几个不同的对象组合为一个对象。例如,Wing、Propeller、Fuselage 和 VerticalStablizer 对象可以组成 Aircraft 对象的一部分。
• ComposableParts 是 MEF 的关键构建块。ComposableParts 支持应用程序通过 Exports 和 Imports 公开和使用组件扩展。
• Contracts 是 Export 和 Import 组件之间的通信途径。Contract 通常通过 Interface 类实现。Contracts 支持 MEF ComposableParts 以避免依赖关系或者与其他组件之间的紧密耦合。
• Conditional Binding 允许加载满足特定元数据标准的组件。您可以选择加载 VerticalStabilizer 组件,这些组件仅由复合石墨 (composite graphite) 组成。
实现扩展的主要方式是,在应用程序的扩展点添加 Import 属性并向扩展添加相应的 Export 属性。Import 和 Export 可以看做是供应商和消费者的关系:Export 组件提供了一些价值;Import 组件消费这些价值。其他扩展选项对于开发人员是开放的,包括完全自定义的扩展方法。