Хорошие примеры импорта MEF2

Я использовал MEF раньше, но сейчас у меня проблемы с новой реализацией. Я экспортирую объекты, наследуемые от базового класса, который имеет атрибут [InheritedExport], и пытаюсь импортировать их.

Раньше я просто имел свойство массива с [ImportMany(typeof(mytype))]] и использовал CompositionInitializer.SatisfyImports(this), чтобы заставить импорт работать, но теперь у меня есть две проблемы:

1) Экспорт находится в другой сборке, на которую ссылаются; 2) CompositionInitializer, кажется, не существует в более новой версии MEF в среде 4.5.

Я пытаюсь создать AggregateCatalog для решения проблемы #1, но понятия не имею, куда идти дальше.

В конце я пытаюсь импортировать коллекцию, которая может использоваться всем приложением WPF, если кто-нибудь может мне помочь с предложением общего решения.

1 ответ

1) Экспорт находится в другой сборке, на которую ссылаются;

Как вы говорите, вам понадобится AggregateCatalog агрегировать ряд каталогов. Обычно вам потребуется один каталог для каждой сборки, содержащей деталь (экспорт / импорт). Это означает, что вам придется использовать класс AssemblyCatalog для каждой из этих загруженных сборок. Вы можете получить доступ к загруженным сборкам через один из типов, которые они содержат. Вот небольшой пример, который добавляет пару AssemblyCatalogs к AggregateCatalog.

AggregateCatalog catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(typeof(SomeClassInSomeAssembly).Assembly));
catalog.Catalogs.Add(new AssemblyCatalog(typeof(SomeClassInAnotherAssembly).Assembly));

Для получения дополнительной информации о каталогах вы можете прочитать эту небольшую статью.

2) CompositionInitializer, кажется, не существует в более новой версии MEF в среде 4.5.

Это доступно только на Silverlight, На WPF вам нужно будет создать CompositionContainer и использовать его SatisfyImports метод.

CompositionContainer container = new CompositionContainer(catalog);
container.SatisfyImports(someObjectWithImports);
Другие вопросы по тегам