zoukankan      html  css  js  c++  java
  • 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] 属性。
     
    原文地址:
     
  • 相关阅读:
    Python界面常用GUI包
    ATSC/DVB/ISDB三大标准比较
    【MPEG】DVB / ATSC / ISDB区别
    Python判断字符串是否为字母或者数字
    MApp_ZUI_CTL_MarqueeTextWinProc字串滚动
    PWM原理及其在电源中的应用
    按键板的原理与实现 扩展GPIO
    按键板的原理与实现----ADC
    使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比
    SQL Server备份还原数据库中的小把戏
  • 原文地址:https://www.cnblogs.com/JavCof/p/3675031.html
Copyright © 2011-2022 走看看