Использование MEF, чтобы позволить пользователю добавлять собственные плагины, запускать метод и изменять набор точек данных.

У меня есть приложение, созданное с помощью Prism и MEF. У меня есть несколько модулей (определенные внутри того же решения), которые я загружаю, и все работает нормально.

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

Мне нужно определить какой-то «контракт», который пользователь должен соблюдать при создании нового плагина. Как бы я это сделал?

Плагин должен быть одиночной .dll внутри папки /Plugin и должен быть загружен во время выполнения, ListView должен быть заполнен в представлении, содержащем UserControl для каждого плагина.


person Nicholas    schedule 11.11.2016    source источник


Ответы (1)


MEF сделает эту работу действительно легкой и гладкой.

Для плагинов:

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

  2. Плагины должны использовать ExportAttribute, чтобы сообщить MEF о них.

    [Export(typeof(IPlugin))]
    public class Plugin : IPlugin
    

Здесь должно быть достаточно.

Для приложения:

  1. Объявите коллекцию, которая получит список подключаемых модулей, которые может найти MEF, не забудьте об атрибуте ImportManyAttribute.

    [ImportMany(typeof(IPlugin))]
    public IEnumerable<IPlugin> Plugins{ get; set; }
    
  2. Создайте свой каталог и контейнер. В коде, который я показываю, я добавляю два каталога, возможно, вам это не нужно, просто чтобы вы знали, что у вас может быть более одного источника.

    AggregateCatalog catalog = new AggregateCatalog();
    catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetEntryAssembly()));
    catalog.Catalogs.Add(new DirectoryCatalog("plugins"));
    var container = new CompositionContainer(catalog);
    
  3. Творите магию. Конечно, this должен быть объектом с этим ImportManyAttribute.

    container.ComposeParts(this);
    
person Paulo Junior    schedule 11.11.2016