MEF Composable Parts and Contracts

组成部件(Composable Parts )

组成部件是MEF内部的组成单元。组成部件导出其它组成部件需要的服务,并且从其它组成部件导入其所需的服务。

组成部件的导入由属性[System.ComponentModel.Composition.Import]定义

组成部件的导出由属性 [System.ComponentModel.Composition.Export]定义

一个组成部件至少包含一个导出。组成部件被添加到容器或或通过目录被创建出来。

默认的目录是,MEF通过组成部件的导出属性标识来识别。

Contracts 合同

组成部件之间不是直接调用的,而是依据合同,一个字符串标识符。每个导出都有一个合同,每个导入都声明一个它需要的合同。

容器通过合同来匹配导入和导出。如果没有定义合同,MEF将隐式使用类型的完全限定名作为合同。

一下导出的合同是等效的。

<textarea cols="50" rows="15" name="code" class="c-sharp">namespace MEFSample { [Export] public class Exporter {...} [Export(typeof(Exporter))] public class Exporter1 {...} [Export("MEFSample.Exporter")] public class Exporter2 {...} } </textarea>

Interface / Abstract contracts

通过使用接口和抽象类,将大大降低耦合程度。

以下代码中两个发送者都实现了IMessageSender。Notifier导入了其Sends()调用的IMEssageSender。

可以看出,新的发送者将很容易被添加到系统中。

<textarea cols="50" rows="15" name="code" class="c-sharp">[Export(typeof(IMessageSender))] public class EmailSender : IMessageSender { ... } [Export(typeof(IMessageSender))] public class TCPSender : IMessageSender { ... } public class Notifier { [ImportMany] public IEnumerable&lt;IMessageSender&gt; Senders {get; set;} public void Notify(string message) { foreach(IMessageSender sender in Senders) sender.Send(message); } } </textarea>

你可能感兴趣的:(MEF Composable Parts and Contracts)