MEF Composable Parts and Contracts

    技术2022-05-20  45

    组成部件(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); } }


    最新回复(0)