使用 MEF 允许用户将自定义插件添加到 运行 方法并更改数据点集合

Using MEF to allow user to add custom plugins, to run a method and change a collection of datapoints

我有一个使用 Prism 和 MEF 构建的应用程序。 我加载了一些模块(在同一解决方案中定义),一切正常。

但是现在我想允许用户添加他们自己的插件(基本上这些插件应该改变数据点的集合)——换句话说,用户创建了一个算法(插件)来改变这些数据点生活在 ViewModel 中。

我需要定义用户在创建新插件时需要反对的某种 "Contract"。我该怎么做?

插件应该是 /Plugin 文件夹中的单个 .dll,并且应该在运行时加载,ListView 应该填充在包含每个插件的 UserControl 的视图中。

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);