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

本文关键字:方法 运行 集合 点集 数据 插件 自定义 许用户 MEF 添加 用户 | 更新日期: 2023-09-27 18:17:35

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

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

我需要定义某种"契约",用户需要在创建新插件时遵守。我该怎么做呢?

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

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

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