Предоставление делегата для инициализации MEF - PullRequest
1 голос
/ 17 ноября 2010

возможно ли предоставить инициализатор объекта Lazy для контейнера 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 ()). Я хотел бы напрямую передать делегат для создания ленивого объекта. Возможно ли это без необходимости специального поставщика экспорта?

Спасибо

1 Ответ

1 голос
/ 17 ноября 2010

Lazy<T> имеет особое значение для импорта MEF.Вместо того, чтобы буквально искать экспорт Lazy<T>, MEF будет искать экспорт T и инстанцировать эту часть лениво.

Попробуйте вместо этого использовать этот тип для импорта и экспорта:

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

Поскольку это другой тип, он не должен иметь особого значения для MEF.

...