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] 属性。
 
原文地址:
相关文章
相关标签/搜索