MEF позволяет легко загружать сборки плагинов. Если у вас есть контроль над плагинами (я имею в виду, что вы можете добавить атрибуты экспорта MEF), то нет необходимости сохранять свой собственный загрузчик плагинов, который использует отражение. MEF сделает все это за вас.
При этом "смешивание и сопоставление" MEF с другими технологиями, безусловно, возможно. Похоже, ваша проблема в том, что если вы используете свой собственный загрузчик плагинов, вы не добавляете эти плагины в контейнер MEF. В результате вы получаете CompositionException
для деталей, которые пытаются импортировать выбранный плагин.
Чтобы добавить плагин, который вы загрузили с собственным кодом в контейнер MEF, вы можете использовать ComposeExportedValue
, например:
container.ComposeExportedValue<IPlugin>(selectedPlugin);
edit: Я понимаю, что вы сейчас имеете в виду под "все или ничего". Ваша проблема в том, что для того, чтобы иметь возможность импортировать детали с помощью MEF, вам также необходимо создать объект с помощью MEF. Затем эта проблема распространяется на объект, который обычно создает этот объект, и т. Д. Вплоть до корня приложения.
Чтобы избежать этого эффекта «все или ничего», вы можете пойти на компромисс, представив контейнер MEF как глобальную переменную (то есть статическое поле). Таким образом, классы могут обращаться к контейнеру MEF и извлекать из него экспорт, например, вызвав Program.Container.GetExportedValue<MyDependency>()
в конструкторе.
edit2 : Если у вас есть объект, который не был сконструирован MEF, есть два способа добавить его в контейнер.
Первый - позвонить container.ComposeExportedValue<IMyContractType>(myObject);
.
Второй - вернуть объект в метод получения свойства, а затем пометить само свойство атрибутом [Export (typeof (SomeType))].