MEF初体验之五:Lazy Exports
在一個(gè)部件組合中,導(dǎo)入將觸發(fā)一個(gè)部件或者多個(gè)部件的實(shí)例化,這些部件暴露了所需原請(qǐng)求部件的必要的導(dǎo)入。對(duì)于一些應(yīng)用程序來(lái)說(shuō),延遲實(shí)例化-防止圖結(jié)構(gòu)下的遞歸組合-可能對(duì)于將創(chuàng)建一個(gè)長(zhǎng)久復(fù)雜的開(kāi)銷很大而不必要的對(duì)象的圖來(lái)說(shuō)是一個(gè)重要的因素。
正是出于這樣的動(dòng)機(jī),MEF支持叫做lazy exports的導(dǎo)出。為了使用它,你需要做的是直接導(dǎo)入一個(gè)[System.Lazy<T>]而不是的[T]。例如,考慮下面的代碼片段:
public class HttpServerHealthMonitor {[Import]public IMessageSender Sender { get; set; } }上面導(dǎo)入的代碼聲明了一個(gè)依賴契約(IMessageSender)實(shí)現(xiàn)。當(dāng)MEF提供這種依賴的時(shí)候,它也將需要?jiǎng)?chuàng)建選中的IMessageSender和遞歸地創(chuàng)建這些實(shí)現(xiàn)可能有的依賴。
為了使導(dǎo)入變的延遲,你僅僅需要用Lazy<IMessageSender>來(lái)替換它:
[Export] public class HttpServerHealthMonitor {[Import]public Lazy<IMessageSender> Sender { get; set; } }在這種情況下,你是選擇在拖延這個(gè)實(shí)例化,直到你真正需要這些實(shí)現(xiàn)實(shí)例。為了請(qǐng)求實(shí)例,請(qǐng)使用[Lazy<T>.Value]屬性。
舉個(gè)例子:
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才真正實(shí)例化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...");}}}輸出結(jié)果:
Lazy<T>是.net 4.0的特性,實(shí)質(zhì)還是對(duì)象的創(chuàng)建問(wèn)題,在某些場(chǎng)合,對(duì)于一些實(shí)例化開(kāi)銷很大的對(duì)象使用。其Value屬性才是真實(shí)T對(duì)象,當(dāng)?shù)谝淮卧L問(wèn)Value屬性時(shí)就會(huì)自動(dòng)創(chuàng)建T實(shí)例。除了調(diào)用默認(rèn)的構(gòu)造器外,還可以調(diào)用重載的構(gòu)造器來(lái)實(shí)例T。另外,也提供了多線程的支持。
轉(zhuǎn)載于:https://www.cnblogs.com/jellochen/p/3662461.html
總結(jié)
以上是生活随笔為你收集整理的MEF初体验之五:Lazy Exports的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java中debug使用
- 下一篇: Firewalld防火墙应用