现在的位置: 首页 > 综合 > 正文

MEF导出元数据

2012年02月13日 ⁄ 综合 ⁄ 共 3962字 ⁄ 字号 评论关闭

导出元数据
在部件导出的时候需要导出相关联的数据,
可以用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; }
}

 

 

抱歉!评论已关闭.