Загрузка плагинов во время выполнения с MEF - PullRequest
2 голосов
/ 20 июля 2010

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

Но теперь я вижу MEF и надеюсь, что смогу сделать то же самое, но более элегантно в коде.

То, что я до сих пор работал с MEF : при запуске я делаю импорт всех плагинов в каталоге (который экспортирует IPlugin) и считываю информацию, такую ​​как имя, категория, автори т. д. ... Они закодированы как экспортированные атрибуты метаданных для классов плагинов.Импорт выполняется лениво, поэтому при запуске все плагины не создаются, что важно.

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

Вместе с информацией о плагине я сохраняю соответствующий экспорт в словаре во время запуска, поэтому, когда графический интерфейс пользователя запрашивает создание плагина с учетом конкретной информации о плагине, у меня есть доступ к экспорту (где Export.Value - мой фактический IPlugin),Но откуда я могу создать экземпляр плагина и создать его с IPluginHost?

Я понял, что должен написать свой собственный ExportProvider, который обслуживает IPluginHost всякий раз, когда кто-то просит об этом, но у меня нетдоступ к сборке или типу конкретного плагина, который позволил бы мне добавить его в каталог, добавить каталог и ExportProvider в контейнер и вызвать .ComposeParts для этого контейнера.

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

Ответы [ 2 ]

2 голосов
/ 20 июля 2010

Если я правильно понимаю, вы ищете способ динамически создавать несколько экземпляров плагина, возможно, одного и того же плагина.

Вам необходимо объявить импорт типа ExportFactory<IPlugin,IPluginMetadata> и затем выберите правильную фабрику на основе метаданных.ExportFactory.CreateExport позаботится о любом импорте, требуемом экземплярами IPlugin, например, IPluginHost, который вы упомянули.

Обратите внимание, что ExportFactory был только в Silverlight-версии MEF в более ранних выпусках.Чтобы получить его в настольном выпуске, вам нужна последняя версия codeplex (MEF 2 - Preview 1).Существует также известная проблема с импортом ExportFactory через конструктор, поэтому используйте свойство.

0 голосов
/ 20 июля 2010

Вы уже создали CompositionContainer?Вы можете использовать его для запроса определенных типов плагинов и создания их экземпляров.Каталоги помогут вам в этом.Вы можете объединить несколько каталогов (используя AggregateCatalog), а затем передать результат в конструктор CompositionContainer.Когда вы запрашиваете конкретный тип IPlugin (просто следите за типом экспорта) и можете попросить CompositionContainer создать экземпляр плагина для вас, и он автоматически выполнит внедрение конструктора.

...