MEF 编程指南(五):延迟导出
2014-04-19 15:03
363 查看
在组合部件的时候,导入将会触发部件(部件集合)的实例化,为原始的请求部件公开必要的导出需求。对于有些应用程序,推迟实例化 - 并且防止递归组合图(Recursive Composition Down The Graph) - 因为创建长而复杂的对象图(Graph Of Object)的花费是昂贵和不必要的,这可能作为一个重要因素来考虑。
这是 MEF 支持延迟导出的动机。为了使用延迟导出,所有需要做的事情是使用导入 [System.Lazy<T>] 直接替换导入 [T] 。如下例代码片段:
上面的代码依赖于契约(IMessageSender)实现导入。当 MEF 提供这种依赖的时候,也需要创建 IMessageSender 选择(Selected)和递归实现可能的依赖关系(Dependencies)。
为了转变为延迟导入,只需用 Lazy<IMessageSender> 替换 IMessageSender:
直到真正需要实现实例时,才会延迟实例化。为了获取实例,使用 [Lazy<T>.Value] 属性。
原文地址:
http://mef.codeplex.com/wikipage?title=Lazy%20Exports&referringTitle=Guide
这是 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] 属性。
原文地址:
http://mef.codeplex.com/wikipage?title=Lazy%20Exports&referringTitle=Guide
相关文章推荐
- MEF 编程指南(三):声明导出
- MEF 编程指南(六):导出和元数据
- MEF 编程指南(二):定义可组合部件和契约
- MEF 编程指南(七):使用目录
- 【转】MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)
- MEF 编程指南(十一):查询 CompositionContainer
- MEF 编程指南(四):声明导入
- MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)
- MEF程序设计指南五:迟延(Lazy)加载导出部件(Export Part)与元数据(Metadata) 推荐
- MEF程序设计指南五:迟延(Lazy)加载导出部件(Export Part)与元数据(Metadata)
- MEF 编程指南(十):重组
- MEF 编程指南(十二):批量组合
- [MEF]第03篇 MEF延迟加载导出部件及元数据
- MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)
- C#可扩展编程之MEF学习笔记(二):MEF的导出(Export)和导入(Import)
- MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)
- [MEF]第03篇 MEF延迟加载导出部件及元数据
- 【转】MEF程序设计指南五:迟延(Lazy)加载导出部件(Export Part)与元数据(Metadata)
- MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)
- MEF程序设计指南五:迟延(Lazy)加载导出部件(Export Part)与元数据(Metadata)