使用 MEF 允许用户将自定义插件添加到 运行 方法并更改数据点集合
Using MEF to allow user to add custom plugins, to run a method and change a collection of datapoints
我有一个使用 Prism 和 MEF 构建的应用程序。
我加载了一些模块(在同一解决方案中定义),一切正常。
但是现在我想允许用户添加他们自己的插件(基本上这些插件应该改变数据点的集合)——换句话说,用户创建了一个算法(插件)来改变这些数据点生活在 ViewModel 中。
我需要定义用户在创建新插件时需要反对的某种 "Contract"。我该怎么做?
插件应该是 /Plugin 文件夹中的单个 .dll,并且应该在运行时加载,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);
我有一个使用 Prism 和 MEF 构建的应用程序。 我加载了一些模块(在同一解决方案中定义),一切正常。
但是现在我想允许用户添加他们自己的插件(基本上这些插件应该改变数据点的集合)——换句话说,用户创建了一个算法(插件)来改变这些数据点生活在 ViewModel 中。
我需要定义用户在创建新插件时需要反对的某种 "Contract"。我该怎么做?
插件应该是 /Plugin 文件夹中的单个 .dll,并且应该在运行时加载,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);