MEF исключение "SourceProvider должен быть установлен." - PullRequest
4 голосов
/ 17 декабря 2009

Я играю с новым System.ComponentModel.Composition пространством имен в .NET 4.0 beta 2, также известным как Managed Extensibility Framework .

Я использую следующий пример 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, но разве вышеприведенное также не сработает?

1 Ответ

5 голосов
/ 18 декабря 2009

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 требуется ссылка на контейнер, заключается в том, что в каталоге могут быть детали с импортом, которые должны удовлетворять другие поставщики экспорта, к которым подключен контейнер.

...