[Export("Oracal", typeof(ILogger))] public class OracalLogger : ILogger { public void WriteLog(string message) { Console.WriteLine("Oracal Logger => {0}", message); } }在导入的时候,需要使用.NET提供的Lazy类来完成。代码如下:
[Import("Oracal", typeof(ILogger))] public Lazy<ILogger> OracalLogger { get; set; }通过Lazy封装的对象即自动提供了延迟加载的机制。访问对象的方式也略微有所改变,当然不能直接通过属性(上例中的OracalLogger)进行访问,而是需要通过Lazy<T>.Value来访问,此属性值包含的即使延迟加载的对象。
[ExportMetadata("Name", "Xml")] [ExportMetadata("Description", "使用的是XML来记录日志")] [Export("Xml", typeof(ILogger))] public class XmlLogger : ILogger { public void WriteLog(string message) { Console.WriteLine("Xml Logger => {0}", message); } }如上代码所示,首先ExportMetadata特性可以被重复的添加到多个多出部件,另外,该特性的两个参数非常的类似于键值对,第一个参数为元数据的名称,第二个参数则是元数据的实际内容。
[Import("Xml", typeof(ILogger))] public Lazy<ILogger, IMetadata> XmlLogger { get; set; }如上代码所示,仍然使用的Lazy类。其中第二个泛型参数表示的就是元数据的接口。定义大致如下:
public interface IMetadata { string Description { get; } string Name { get; } }仔细对比后会发现,该接口中的成员名称和导出部件中的元数据名称是如此的一致。实是上不仅其名称要保持一致,连数据类型也要保持一致,否则导入的时候将会引发异常。
Console.WriteLine(program.XmlLogger.Metadata.Name); Console.WriteLine(program.XmlLogger.Metadata.Description);
原文:http://blog.csdn.net/gjysk/article/details/44802715