Загрузка плагинов во время выполнения с MEF

2

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

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

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

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

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

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

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

Теги:
plugins
dynamic
mef

2 ответа

2
Лучший ответ

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

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

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

  • 0
    Если у вас был успех с MEF 2 Preview 1, я получаю конфликты сборки с .NET 4.0 System.Components.Composition one! ExportFactory - это именно то, для чего я этого хотел!
  • 0
    Извини за поздний ответ. Я смог решить мою проблему с ExportFactory, как объяснено. используя .net 3.5, хотя.
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню