2016-11-11 27 views
0

我有一个由Prism和MEF构建的应用程序。 我有一些模块(在相同的解决方案内定义),我加载和一切工作正常。使用MEF允许用户添加自定义插件,运行方法并更改数据点的集合

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

我需要定义某种“合同”的用户需要创建一个新的插件时ophold。我将如何做到这一点?

插件应该是一个/插件文件夹中的单个.dll和应在运行时加载,一个ListView应在包含各插件一个用户控件的图来填充。

回答

2

MEF将使这项工作非常轻松顺利。

对于插件:

  1. 创建你的插件A接口。 它并不真正需要非常复杂的,虽然你可以用它来迫使开发人员添加一些说明或版本信息,当然接收您的收藏把它转换的方法。

  2. 插件应该使用ExportAttribute让MEF知道它们。

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

这应该是enougth这里。

对于应用程序:

  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); 
    
相关问题