• MEF 编程指南(五):延迟导出


    在组合部件的时候,导入将会触发部件(部件集合)的实例化,为原始的请求部件公开必要的导出需求。对于有些应用程序,推迟实例化 - 并且防止递归组合图(Recursive Composition Down The Graph) - 因为创建长而复杂的对象图(Graph Of Object)的花费是昂贵和不必要的,这可能作为一个重要因素来考虑。

     
    这是 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] 属性。
     
    原文地址:
     
  • 相关阅读:
    perl dbi 控制事务
    READ-COMMITTED 不能进行可重复读和防止幻读
    REPEATABLE-READ 预读
    如何规划农商行商业智能系统中的决策分析系统?
    如何规划农商行商业智能系统中的决策分析系统?
    【MySQL】gap lock 浅析
    REPEATABLE-READ和READ-COMMITTED幻读
    ORA-01555: snapshot too old
    CXF动态客户端调用webservice实例
    mysql 区间锁
  • 原文地址:https://www.cnblogs.com/JavCof/p/3675031.html
Copyright © 2020-2023  润新知