日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MEF初体验之五:Lazy Exports

發布時間:2024/9/5 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MEF初体验之五:Lazy Exports 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在一個部件組合中,導入將觸發一個部件或者多個部件的實例化,這些部件暴露了所需原請求部件的必要的導入。對于一些應用程序來說,延遲實例化-防止圖結構下的遞歸組合-可能對于將創建一個長久復雜的開銷很大而不必要的對象的圖來說是一個重要的因素。

正是出于這樣的動機,MEF支持叫做lazy exports的導出。為了使用它,你需要做的是直接導入一個[System.Lazy<T>]而不是的[T]。例如,考慮下面的代碼片段:

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

上面導入的代碼聲明了一個依賴契約(IMessageSender)實現。當MEF提供這種依賴的時候,它也將需要創建選中的IMessageSender和遞歸地創建這些實現可能有的依賴。

為了使導入變的延遲,你僅僅需要用Lazy<IMessageSender>來替換它:

[Export] public class HttpServerHealthMonitor {[Import]public Lazy<IMessageSender> Sender { get; set; } }

在這種情況下,你是選擇在拖延這個實例化,直到你真正需要這些實現實例。為了請求實例,請使用[Lazy<T>.Value]屬性。

舉個例子:

using System; using System.Collections.Generic; using System.ComponentModel.Composition; using System.ComponentModel.Composition.Hosting; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks;namespace ImportsDeclaring {class Example2{[Import]private Lazy<ILogger> logger;static void Main(){Example2 e2 = new Example2();e2.Compose();e2.logger.Value.Log("Hi,MEF");//獲取Lazy<T>.Value才真正實例化Logger Console.ReadKey();}void Compose(){var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());var container = new CompositionContainer(catalog);container.ComposeParts(this);}}interface ILogger{void Log(string msg);}[Export(typeof(ILogger))]class Logger : ILogger{public Logger(){}public void Log(string msg){Console.WriteLine("Logging...");}}}

輸出結果:

Lazy<T>是.net 4.0的特性,實質還是對象的創建問題,在某些場合,對于一些實例化開銷很大的對象使用。其Value屬性才是真實T對象,當第一次訪問Value屬性時就會自動創建T實例。除了調用默認的構造器外,還可以調用重載的構造器來實例T。另外,也提供了多線程的支持。

轉載于:https://www.cnblogs.com/jellochen/p/3662461.html

總結

以上是生活随笔為你收集整理的MEF初体验之五:Lazy Exports的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。