Мое приложение позволяет пользователям писать плагины (реализующие IPlugin), которые они могут создавать во время выполнения.При запуске каталог плагина .dlls анализируется, регистрируя всю доступную информацию о плагинах.Во время выполнения предоставляется графический интерфейс, который позволяет пользователям создавать экземпляры любого из плагинов.Это отлично работает.
Но теперь я вижу MEF и надеюсь, что смогу сделать то же самое, но более элегантно в коде.
То, что я до сих пор работал с MEF : при запуске я делаю импорт всех плагинов в каталоге (который экспортирует IPlugin) и считываю информацию, такую как имя, категория, автори т. д. ... Они закодированы как экспортированные атрибуты метаданных для классов плагинов.Импорт выполняется лениво, поэтому при запуске все плагины не создаются, что важно.
Проблема в том, что теперь я не вижу способа элегантно создать экземпляр выбранного плагина ввремя выполнения, учитывая дополнительное усложнение, заключающееся в том, что конструктор плагинов является конструктором импорта, который импортирует ссылку на IPluginHost (который требуется немедленно для некоторой инициализации).
Вместе с информацией о плагине я сохраняю соответствующий экспорт в словаре во время запуска, поэтому, когда графический интерфейс пользователя запрашивает создание плагина с учетом конкретной информации о плагине, у меня есть доступ к экспорту (где Export.Value - мой фактический IPlugin),Но откуда я могу создать экземпляр плагина и создать его с IPluginHost?
Я понял, что должен написать свой собственный ExportProvider, который обслуживает IPluginHost всякий раз, когда кто-то просит об этом, но у меня нетдоступ к сборке или типу конкретного плагина, который позволил бы мне добавить его в каталог, добавить каталог и ExportProvider в контейнер и вызвать .ComposeParts для этого контейнера.
Надеюсь, я прояснил свою проблему, если нет, позвольте мне попробовать короткую версию вопроса : разве это не стандартный сценарий использования MEF для программы с отложенной загрузкой?плагины при запуске, чтобы проанализировать информацию о доступных плагинах, а затем во время выполнения создать конкретные экземпляры, учитывая конкретные плагины?было бы замечательно получить набросок кодов участвующих шагов.