您的位置:首页 > 编程语言

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

2014-04-19 15:03 363 查看
在组合部件的时候,导入将会触发部件(部件集合)的实例化,为原始的请求部件公开必要的导出需求。对于有些应用程序,推迟实例化 - 并且防止递归组合图(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] 属性。

原文地址:
http://mef.codeplex.com/wikipage?title=Lazy%20Exports&referringTitle=Guide
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: