Исключение MEF «Должен быть установлен SourceProvider».

StackOverflow https://stackoverflow.com/questions/1923184

  •  20-09-2019
  •  | 
  •  

Вопрос

Я играюсь с новым System.ComponentModel.Composition пространство имен в .NET 4.0 beta 2, также известное как Платформа управляемой расширяемости.

Я использую следующий пример C#, где Monkey импортирует Banana:

public interface IBanana 
{ 
}

[Export(typeof(IBanana))]
public class Banana : IBanana 
{ 
} 

public class Monkey
{
    [Import(typeof(IBanana))]
    public IBanana Banana { get; set; }
}

Однако когда я пытаюсь составить обезьяну следующим образом, я получаю InvalidOperationException с сообщением "Этот объект не инициализирован — необходимо установить свойство SourceProvider.":

var exportProvider = new CatalogExportProvider(new TypeCatalog(typeof(Banana)));
var container = new CompositionContainer(exportProvider);
var monkey = new Monkey();
container.ComposeParts(monkey);

Что мне здесь не хватает?Я знаю, что могу передать каталог напрямую, не помещая его в CatelogExportProvider, но разве вышеизложенное не должно работать?

Это было полезно?

Решение

CatalogExportProvider нужна обратная ссылка на контейнер.Следующий код должен работать:

var exportProvider = new CatalogExportProvider(new TypeCatalog(typeof(Banana)));
var container = new CompositionContainer(exportProvider);
exportProvider.SourceProvider = container;
var monkey = new Monkey();
container.ComposeParts(monkey);

Контейнер делает это автоматически, когда вы передаете каталог в конструктор.Я не думаю, что часто есть большая причина создавать CatalogExportProvider вручную.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top