Перехват в MEF состав и выбор импорта - PullRequest
2 голосов
/ 08 февраля 2012

каждый

Проблема в том, что если существуют два экспортированных компонента, которые имеют одинаковую подпись экспорта, но должен быть импортирован только один (это возможно, практический пример - установить новый плагин для замены старого без удаления)Старый. ).Мы можем предоставить файл конфигурации, чтобы указать, какой компонент должен быть импортирован, но вопрос в том, как указать MEF правильный выбор?

У меня есть три метода:

  1. ИспользованиеПользовательский каталог, фильтр доступных плагинов.Но предположим, что A импортирует компонент A, а B импортирует компонент B, а компоненты A и B имеют одну и ту же сигнатуру экспорта.Пользовательский каталог не может обработать это, за исключением того, что мы создаем новый пользовательский каталог для каждого компонента.

  2. Перехват в композиции MEF.Я не уверен, возможно ли это, и я не знаю как.Но если есть способ, позволяющий нам перехватывать в процессе компоновки, он может быть лучшим.

  3. Используйте оболочку импорта вместо реального интерфейса.Когда компонент создается, он инициализирует оболочку и позволяет оболочке обрабатывать логику выбора (например, выводить окно и позволить пользователю выбрать одну или прочитать конфигурацию)

1 Ответ

2 голосов
/ 08 февраля 2012

как насчет использования [ImportMany], чтобы получить все возможные импорты для одной и той же подписи, а затем выбрать тот, который вы хотите для определенного условия (файл конфигурации или что-то еще), из этого списка импортов?

РЕДАКТИРОВАТЬ: мне нравится ваше предложение № 3, я думаю, что это может быть легко. ваша оболочка обрабатывает реальные интерфейсы с помощью [ImportMany], а плагины запрашивают у вашей оболочки GetTheOneInterface ().

...