为MEF初始化提供委托

时间:2010-11-17 12:21:25

标签: c# .net-4.0 mef composition

是否可以为MEF容器提供Lazy对象初始值设定项?

这是一个例子:

[Export]
public class Bar
{
  [ImportingConstructor[
  public Bar([Import] Lazy<Foo> foo)
  {
    // [..]
  }
}

TypeCatalog catalog = new TypeCatalog(typeof(Bar));
CompositionContainer container = new CompositionContainer(catalog);
Lazy<Foo> initializer = new Lazy(() =>
{
  Foo foo = new Foo();
  // foo initialization here
  return foo;
});
container.ComposeExportedValue(initializer);
CompositionBatch batch = new CompositionBatch();
container.Compose(batch);
var export = container.GetExportedValue<Bar>(); // composition fails

这段代码不起作用,如果我调用container.ComposeExportedValue(new Foo())就可以了。 我想直接传递一个委托来创建惰性对象。是否可以不需要自定义导出提供程序?

谢谢

1 个答案:

答案 0 :(得分:1)

Lazy<T>对MEF导入具有特殊含义。 MEF将寻找Lazy<T>导出并懒惰地实例化该部分,而不是从字面上看T导出。

尝试使用此类型代替导入和导出:

public class LazyPart<T> : Lazy<T>
{
    public LazyPart(Func<T> initializer) : base(initializer)
    {
    }
}

由于它是一种不同的类型,它对MEF没有特殊含义。