Electronic Joint Business

Solution for E-Business

深入MEF框架 (二)契约与导入、导出

契约 所谓的契约即一种约定,或者叫做规则。在上一节的例子中,在对象 StringProvider 中就定义了一个导出部件属性(Output),并为其指定了通信契约为“Message”。这里的 “Message” 就是种约定,即:在需要使用到这个属性的地方,都可以利用 [Import] 引用契约(“Message”)进行部件的导入。 在 MEF 中可组合部件并非是直接依赖于彼此,它们都依赖于一个契约,也就是一个标示字符串。每个导出都有一个契约,而导入需要声明它需要依据哪个契约。容器通过使用契约信息来匹配导入和导出。如果没有指明契约,MEF 默认使用类型的全限定名作为契约。实际上这一步可以简单的理解为“依赖注入”,本质上就是对象的实例初始化过程。如果在导出中指定了类型,MEF 则会使用该类型全限定名。 注意:对于非基本类型,默认情况下,应该使用类型而不建议使用字符串在作为契约。虽然契约可以是字符串,但可能会导致一些混淆。比如 “Sender” 这个契约可能与另一个实现里的 “Sender” 重名。因此如果使用字符串作为契约,最好遵循名称空间的写法并带上公司的名字,比如”Contoso.Exports.Sender”。 下面的代码中出现的所有导出契约都是等价的。 namespace MEF.Examples{        [Export]        public class Exporter {…}         [Export(typeof(Exporter))]       public class Exporter{…}             [Export("MEF.Examples.Exporter")]        public class Exporter{…}    } 可组合部件的普遍模式是采用接口或者抽象类型来作为契约,而不是具体类型。这样导入部件完全与其导入的导出部件的某个特定实现解耦从而分离关注。比如如下的代码中,有两个类都导出了IMessageSender。Notifier类导入一组IMessageSender,并调用其中每一项的Send()方法。现在新的信息发送器可以很容易的被添加到系统中去。 [Export(typeof(IMessageSender))] public class EmailSender : IMessageSender { … } [Export(typeof(IMessageSender))] public class TCPSender : IMessageSender { … } public class […]

, ,

2 thoughts on “深入MEF框架 (二)契约与导入、导出

Leave a Reply

Your email address will not be published. Required fields are marked *