MEF系列二:定义部件(Parts)和契约(Contracts)
2013-12-31 15:19
337 查看
组合部件(Parts)
部件(Part)在MEF中是一个可组合单元,组合部件导出服务为其它组合部件所需要,导入服务来自其它的组合部件。在MEF编程模型中,组合部件用System.ComponentModel.Composition.Import 和[System.ComponentModel.Composition.Export]来标识是导入还是导出。一个组合部件最少包含一个导出,部件通过手工指定或通过创建使用目录来添加到组合容器对象中,MEF附带的默认目录识别组合部件通过存在的导出属性。
契约(Contracts)
组合部件不直接依赖于另一个,而是依赖于一个字符串标识契约。所有导出部件都有一个契约,所有导入声明它所需要的契约。组合容器对象使用导入的契约信息来匹配导出。如果没有明确指定契约,MEF将默认使用类型完全限定名称作为契约。如果类型是通过的,它将使用完全限定名称。注:默认契约应该是一个类型,而不是一个字符串。尽管契约可以是一个任意的字符串,这可能导致歧义。例如"Sender"可能与在另一个库中实现了"Sender"重叠,出于这个原因,你需要指定一个字符串契约,建议契约名称应该包含公司名称空间限定的名称,例如"Contoso.Exports.Sender"。
下面代码片断,所有的导出契约都是相同的
namespace MEFSample { [Export] public class Exporter {...} [Export(typeof(Exporter))] public class Exporter1 {...} [Export("MEFSample.Exporter")] public class Exporter2 {...} }接口/抽象契约
一个常见的模式是组合部件导出一个接口或抽象类型而不是一个具体类型。它允许导入跟导出的实现完全解耦,使得导入的关注点分离。例如下面你可以看到两个Sender实现导出IMessageSender,Notifier类导入IMessageSender对象的集合,IMessageSender可以调用它的Send()方法,新的Message Senders现在可以很容易被添加到系统。
[Export(typeof(IMessageSender))] public class EmailSender : IMessageSender { ... } [Export(typeof(IMessageSender))] public class TCPSender : IMessageSender { ... } public class Notifier { [ImportMany] public IEnumerable<IMessageSender> Senders {get; set;} public void Notify(string message) { foreach(IMessageSender sender in Senders) sender.Send(message); } }
契约程序集
一种常见的模式,当部署契约集合构建MEF可扩展应用程序,契约集合只是包含填充用于扩展你的应用程序的契约类型,一般这些将会是接口,也有可能是抽象类,另外契约集合也有可能包含导入可能会使用的元数据视图接口,以及任何自定义MEF导出属性。注:你必须指定明确接口类型(IMessageSender)作为导出,否则类型(EmailSender)本身将被导出
注:以上只是为了方便我自己学习记录,有些地方翻译不到位,唯恐误导读者,如有需要请阅读原文http://mef.codeplex.com/wikipage?title=Parts&referringTitle=Guide
相关文章推荐
- [MEF程序设计指南]定义可以组合的部件和契约
- MEF程序设计指南三:MEF中组合部件(Composable Parts)与契约(Contracts)的基本应用
- MEF中组合部件(Composable Parts)与契约(Contracts)的基本应用 推荐
- MEF程序设计指南三:MEF中组合部件(Composable Parts)与契约(Contracts)的基本应用
- MEF程序设计指南三:MEF中组合部件(Composable Parts)与契约(Contracts)的基本应用
- MEF程序设计指南三:MEF中组合部件(Composable Parts)与契约(Contracts)的基本应用
- MEF初体验之二:定义组合部件和契约
- MEF 编程指南(二):定义可组合部件和契约
- 【转】MEF程序设计指南三:MEF中组合部件(Composable Parts)与契约(Contracts)的基本应用
- 【转】MEF程序设计指南三:MEF中组合部件(Composable Parts)与契约(Contracts)的基本应用
- MEF Composable Parts and Contracts
- MEF学习笔记(2):定义组成部件和契约
- 一步一个脚印学习WCF系列之WCF契约设计—2-复杂类型序列化之可序列化类型SerializableAttribute
- Dropthings系列第三篇-定义个性化门户
- CSS样式表对同一个部件,只能用一个样式表CSS Style来定义....
- DNN模块开发系列文章(3)——在DNN中添加模块定义
- C#系列教程——lock语句定义及使用
- AxureRP7.0基础教程系列 部件详解 List Box 列表选择框
- 【转】MEF程序设计指南五:迟延(Lazy)加载导出部件(Export Part)与元数据(Metadata)
- WCF面向服务应用程序系列之二:契约设计(ExplicitContract)