声明导出解释了部件导出服务的基础知识和价值观(Values)。有时候出于种种原因,导出关联信息是非常必要的。通常,用于解释关于功能公共契约的具体实现。允许导入满足约束要求的导出,或者导入所有可用的实现并且在导出前在运行时检查他们的功能。
[Export(typeof(IMessageSender))] [ExportMetadata("transport", "smtp")] public class EmailSender : IMessageSender { public void Send(string message) { Console.WriteLine(message); } } [Export(typeof(IMessageSender))] [ExportMetadata("transport", "smtp")] [ExportMetadata("secure", null)] public class SecureEmailSender : IMessageSender { public void Send(string message) { Console.WriteLine(message); } } [Export(typeof(IMessageSender))] [ExportMetadata("transport", "phone_network")] public class SMSSender : IMessageSender { public void Send(string message) { Console.WriteLine(message); } } public interface IMessageSender { void Send(string message); }
[MetadataAttribute] [AttributeUsage(AttributeTargets.Class, AllowMultiple=false)] public class MessageSenderAttribute : ExportAttribute { public MessageSenderAttribute() : base(typeof(IMessageSender)) { } public MessageTransport Transport { get; set; } public bool IsSecure { get; set; } } public enum MessageTransport { Undefined, Smtp, PhoneNetwork, Other } public interface IMessageSender { void Send(string message); }
[MessageSender(Transport=MessageTransport.Smtp)] public class EmailSender : IMessageSender { public void Send(string message) { Console.WriteLine(message); } } [MessageSender(Transport=MessageTransport.Smtp, IsSecure=true)] public class SecureEmailSender : IMessageSender { public void Send(string message) { Console.WriteLine(message); } } [MessageSender(Transport=MessageTransport.PhoneNetwork)] public class SMSSender : IMessageSender { public void Send(string message) { Console.WriteLine(message); } }
public interface IMessageSenderCapabilities { MessageTransport Transport { get; } bool IsSecure { get; } }
public class HttpServerHealthMonitor { [ImportMany] public Lazy<IMessageSender, IMessageSenderCapabilities>[] Senders { get; set; } public void SendNotification() { Compose(); foreach (var sender in Senders) { if (sender.Metadata.Transport == MessageTransport.Smtp && sender.Metadata.IsSecure) { var messageSender = sender.Value; messageSender.Send("Server is fine"); break; } } } private void Compose() { //var container = new CompositionContainer(); //container.ComposeParts(this, new EmailSender()); AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); var container = new CompositionContainer(catalog); container.ComposeParts(this); } }
MEF 编程指南(六):导出和元数据,布布扣,bubuko.com
原文:http://www.cnblogs.com/JavCof/p/3679224.html