我有一个用Prism和MEF构建的应用程序。 我有一些模块(在同一解决方案中定义),我加载,一切正常。
但是现在我想允许用户添加他们自己的插件(基本上这些插件应该改变数据点的集合) - 换句话说,用户创建一个算法(插件)来改变生活在里面的这些数据点一个ViewModel。
我需要定义用户在创建新插件时需要隐藏的某种“合同”。我该怎么做?
插件应该是/ plugin文件夹中的单个.dll,并且应该在运行时加载,应该在包含每个插件的UserControl的视图中填充ListView。
答案 0 :(得分:2)
MEF将使这项工作变得非常简单和顺利。
对于插件:
为插件创建一个界面。 它并不需要非常复杂,尽管您可以使用它来强制开发人员添加一些描述或版本信息,当然还有一种方法可以接收您的集合并对其进行转换。
pluguins应该使用ExportAttribute让MEF了解它们。
ng-show="user.validate.step1.firstname.$invalid && !user.validate.step1.firstname.$pristine"
这应该是理解的。
申请表:
声明一个集合,它将接收MEF可以找到的插件列表,不要忘记ImportManyAttribute。
[Export(typeof(IPlugin))]
public class Plugin : IPlugin
创建目录和容器。 在我展示的代码中,我添加了两个目录,也许你不需要它,只是因为你知道你可以拥有更多的一个源。
[ImportMany(typeof(IPlugin))]
public IEnumerable<IPlugin> Plugins{ get; set; }
做神奇的事。
当然AggregateCatalog catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetEntryAssembly()));
catalog.Catalogs.Add(new DirectoryCatalog("plugins"));
var container = new CompositionContainer(catalog);
应该是this
的对象。
ImportManyAttribute