C# 为MEF初始化提供委托

C# 为MEF初始化提供委托,c#,.net-4.0,mef,composition,C#,.net 4.0,Mef,Composition,可以为MEF容器提供惰性对象初始值设定项吗 这是一个例子: [Export] public class Bar { [ImportingConstructor[ public Bar([Import] Lazy<Foo> foo) { // [..] } } TypeCatalog catalog = new TypeCatalog(typeof(Bar)); CompositionContainer container = new CompositionC

可以为MEF容器提供惰性对象初始值设定项吗

这是一个例子:

[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
[导出]
公共类酒吧
{
[导入构造函数][
公共栏([Import]Lazy foo)
{
// [..]
}
}
TypeCatalog=新的TypeCatalog(typeof(Bar));
CompositionContainer=新的CompositionContainer(目录);
惰性初始值设定项=新惰性(()=>
{
Foo-Foo=新的Foo();
//这里是foo初始化
返回foo;
});
ComposeExportedValue(初始值设定项);
CompositionBatch=新的CompositionBatch();
容器。组成(批);
var export=container.GetExportedValue();//组合失败
这段代码不起作用,但如果调用container.ComposeExportedValue(new Foo()),它就起作用了。 我想直接传递一个委托来创建惰性对象。是否可以不需要自定义导出提供程序

谢谢

Lazy
对MEF导入有特殊的意义。MEF将查找
T
导出并延迟实例化该部分,而不是字面上查找
Lazy
导出

尝试在导入和导出时使用此类型:

public class LazyPart<T> : Lazy<T>
{
    public LazyPart(Func<T> initializer) : base(initializer)
    {
    }
}
公共类懒散部分:懒惰
{
公共LazyPart(Func初始值设定项):base(初始值设定项)
{
}
}
因为它是一种不同的类型,所以它对MEF没有特殊意义。

Lazy
对MEF导入有特殊意义。MEF将查找
Lazy
导出,而不是逐字查找
T
导出并惰性地实例化该部分

尝试在导入和导出时使用此类型:

public class LazyPart<T> : Lazy<T>
{
    public LazyPart(Func<T> initializer) : base(initializer)
    {
    }
}
公共类懒散部分:懒惰
{
公共LazyPart(Func初始值设定项):base(初始值设定项)
{
}
}
因为它是一种不同的类型,所以它对MEF没有特殊意义