【问题标题】:Providing delegate to MEF initialization为 MEF 初始化提供委托
【发布时间】:2010-11-17 12:21:24
【问题描述】:

是否可以为 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

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

谢谢

【问题讨论】:

    标签: c# .net-4.0 mef composition


    【解决方案1】:

    Lazy&lt;T&gt; 对于 MEF 导入具有特殊含义。 MEF 不会逐字查找 Lazy&lt;T&gt; 导出,而是查找 T 导出并懒惰地实例化该部分。

    尝试将此类型用于您的导入和导出:

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

    既然是不同的类型,对MEF应该没有特殊意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 2012-08-26
      相关资源
      最近更新 更多