您的位置:首页 > 其它

MEF Composable Parts and Contracts

2011-04-15 16:26 169 查看
组成部件(Composable Parts )

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

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

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

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

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

Contracts 合同

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

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

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

namespace MEFSample
{
[Export]
public class Exporter {...}

[Export(typeof(Exporter))]
public class Exporter1 {...}

[Export("MEFSample.Exporter")]
public class Exporter2 {...}
}


Interface / Abstract contracts

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

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

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

[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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: