使用MEF允许用户添加自定义插件,运行方法和更改数据点集合
本文关键字:方法 运行 集合 点集 数据 插件 自定义 许用户 MEF 添加 用户 | 更新日期: 2023-09-27 18:17:35
我有一个使用Prism和MEF构建的应用程序。我有一些模块(定义在相同的解决方案),我加载和一切工作正常。
然而现在我想允许用户添加自己的插件(基本上这些插件应该改变数据点的集合)-所以换句话说,用户创建一个算法(插件)来改变这些数据点,这些数据点生活在ViewModel中。
我需要定义某种"契约",用户需要在创建新插件时遵守。我该怎么做呢?
插件应该是一个单独的.dll在/plugin文件夹中,应该在运行时加载,ListView应该在一个视图中填充,每个插件包含一个UserControl。
MEF将使这项工作非常容易和顺利。
插件:
-
为你的插件创建一个接口。它并不需要非常复杂,尽管您可以使用它来强制开发人员添加一些描述或版本信息,当然还有一个接收您的集合并对其进行转换的方法。
-
插件应该使用ExportAttribute让MEF知道它们。
[Export(typeof(IPlugin))] public class Plugin : IPlugin
这里应该足够了。
应用程序:
-
声明一个集合来接收MEF可以找到的插件列表,不要忘记ImportManyAttribute。
[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
的对象。container.ComposeParts(this);