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