在组合部件的时候,导入将会触发部件(部件集合)的实例化,为原始的请求部件公开必要的导出需求。对于有些应用程序,推迟实例化 - 而且防止递归组合图(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); }