MEF 編程指南(五):延遲導出

在組合部件的時候,導入將會觸發部件(部件集合)的實例化,爲原始的請求部件公開必要的導出需求。對於有些應用程序,推遲實例化 - 而且防止遞歸組合圖(Recursive Composition Down The Graph) - 由於建立長而複雜的對象圖(Graph Of Object)的花費是昂貴和沒必要要的,這可能做爲一個重要因素來考慮。ide

 
這是 MEF 支持延遲導出的動機。爲了使用延遲導出,全部須要作的事情是使用導入 [System.Lazy<T>] 直接替換導入 [T] 。以下例代碼片斷:
 
public class HttpServerHealthMonitor 

{
    [Import]
    public IMessageSender Sender { get; set; }
}

上面的代碼依賴於契約(IMessageSender)實現導入。當 MEF 提供這種依賴的時候,也須要建立 IMessageSender 選擇(Selected)和遞歸實現可能的依賴關係(Dependencies)。
 
爲了轉變爲延遲導入,只需用 Lazy<IMessageSender> 替換 IMessageSender:
 
 
 
    class Program
    {
        static void Main(string[] args)
        {
            var monitor = new HttpServerHealthMonitor();
            monitor.Run();
        }
    }
 
    [Export]
    public class HttpServerHealthMonitor
    {
        [Import]
        public Lazy<IMessageSender> Sender { get; set; }
 
        public void Run()
        {
            Compose();
            // 延遲導出,請求 Lazy<IMessageSender> 時,實例化 IMessageSender 導出
            var v = Sender.Value;
            v.Send("test");
        }
 
        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);
        }
    }
 
    [Export(typeof(IMessageSender))]
    public class EmailSender : IMessageSender
    {
        public void Send(string message)
        {
            Console.WriteLine(message);
        }
    }
 
    public interface IMessageSender
    {
        void Send(string message);
    }

 

 
直到真正須要實現實例時,纔會延遲實例化。爲了獲取實例,使用 [Lazy<T>.Value] 屬性。
 
原文地址:
相關文章
相關標籤/搜索