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

时间:2016-11-11 18:01:55

标签: c# plugins mef

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

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

我需要定义用户在创建新插件时需要隐藏的某种“合同”。我该怎么做?

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

1 个答案:

答案 0 :(得分:2)

MEF将使这项工作变得非常简单和顺利。

对于插件:

  1. 为插件创建一个界面。 它并不需要非常复杂,尽管您可以使用它来强制开发人员添加一些描述或版本信息,当然还有一种方法可以接收您的集合并对其进行转换。

  2. pluguins应该使用ExportAttribute让MEF了解它们。

    ng-show="user.validate.step1.firstname.$invalid && !user.validate.step1.firstname.$pristine"
    
  3. 这应该是理解的。

    申请表:

    1. 声明一个集合,它将接收MEF可以找到的插件列表,不要忘记ImportManyAttribute。

      [Export(typeof(IPlugin))]
      public class Plugin : IPlugin
      
    2. 创建目录和容器。 在我展示的代码中,我添加了两个目录,也许你不需要它,只是因为你知道你可以拥有更多的一个源。

      [ImportMany(typeof(IPlugin))]
      public IEnumerable<IPlugin> Plugins{ get; set; }
      
    3. 做神奇的事。 当然AggregateCatalog catalog = new AggregateCatalog(); catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetEntryAssembly())); catalog.Catalogs.Add(new DirectoryCatalog("plugins")); var container = new CompositionContainer(catalog); 应该是this的对象。

      ImportManyAttribute