Хорошие примеры импорта 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);