是否可以为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())就可以了。 我想直接传递一个委托来创建惰性对象。是否可以不需要自定义导出提供程序?
谢谢
答案 0 :(得分:1)
Lazy<T>
对MEF导入具有特殊含义。 MEF将寻找Lazy<T>
导出并懒惰地实例化该部分,而不是从字面上看T
导出。
尝试使用此类型代替导入和导出:
public class LazyPart<T> : Lazy<T>
{
public LazyPart(Func<T> initializer) : base(initializer)
{
}
}
由于它是一种不同的类型,它对MEF没有特殊含义。