MEF导出元数据
导出元数据
在部件导出的时候需要导出相关联的数据,
可以用ExportMetadata来导出元数据。
简单的元数据导出实例,参考http://mef.codeplex.com/
using System;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
namespace MetaData
{
class Program
{
[Import]
public HttpServerHealthMoniter hhm { get; set; }
static void Main(string[] args)
{
Program p = new Program();
p.Run();
}
public void Run()
{
Compent();
hhm.SenderNotification();
Console.Read();
}
/// <summary>
/// 组合容器
/// </summary>
private void Compent()
{
var catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
}
public interface IMessageSender
{
void Send(string message);
}
#region
/*
[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);
}
}
*/
#endregion
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class MessageSenderAttribute : ExportAttribute
{
public MessageSenderAttribute() : base(typeof(IMessageSender)) { }
public MessageTransport Transport { set; get; }
public bool IsSecure { get; set; }
}
public enum MessageTransport
{
Undifined,
Smtp,
PhoneNetWork,
Other
}
[Export(typeof(IMessageSender))]
[MessageSender(Transport = MessageTransport.Smtp)]
public class EmailSender : IMessageSender
{
public void Send(string message)
{
Console.WriteLine(message);
}
}
[Export(typeof(IMessageSender))]
[MessageSender(Transport = MessageTransport.Smtp, IsSecure = true)]
public class SecureEmailSender : IMessageSender
{
public void Send(string message)
{
Console.WriteLine(message);
}
}
[Export(typeof(IMessageSender))]
[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; }
}
[Export]
public class HttpServerHealthMoniter
{
[ImportMany]
public Lazy<IMessageSender, IMessageSenderCapabilities>[] senders { get; set; }
public void SenderNotification()
{
foreach (var sender in senders)
{
if (sender.Metadata.Transport == MessageTransport.Smtp && sender.Metadata.IsSecure)
{
var messagersender = sender.Value;
messagersender.Send("server is fine !");
break;
}
}
}
}
}
[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; }
[DefaultValue(false)];
bool IsSecure { get; }
}