带GUI的插件架构

noa*_*oah 20 .net c# plugins

我正在开发一个大量使用插件的应用程序.该应用程序在C#中,我正在考虑在WPF中构建配置GUI.在如何管理实际插件本身方面,我得到了插件架构.但是,每个插件都有自己的配置,这就是我在寻求帮助的地方.

插件架构很简单 - 有一个插件工具的接口,我只是加载目录中的所有插件.但是,插件从哪里获取配置?我想有一些通用的方法来处理这个,所以每个插件都不负责读取自己的配置文件.此外,我希望GUI随每个插件一起扩展 - 也就是说,安装的每个插件都应该向GUI添加一个选项卡,其中包含该插件的特定配置选项.然后在保存时,将保存配置文件.

我最好的办法是什么?

Jor*_*oba 8

为可配置插件定义接口:

public interface IConfigurable
{
  public void LoadConfig(string configFile);

  public void ShowConfig();

  // Form or whatever, allows you to integrate it into another control
  public Form GetConfigWindow();
}
Run Code Online (Sandbox Code Playgroud)

只需调用IConfigurable接口即可配置插件.

如果你想要你可以让界面以另一种方式工作,让主应用程序为插件提供一个容器(例如一个框架或一个底座),但是我会推荐相反的方法.

public interface IConfigurable
{
  void LoadConfig(string configFile);

  void ShowConfig(DockPanel configurationPanel);
}
Run Code Online (Sandbox Code Playgroud)

最后,您可以通过严格定义插件可以作为配置选项提供的内容来做到这一点.

public interface IMainConfigInterop
{
  void AddConfigurationCheckBox(ConfigurationText text);
  void AddConfigurationRadioButton(ConfigurationText text);
  void AddConfigurationSpinEdit(Confguration text, int minValue, int maxValue);
}

public interface IConfigurable
{
  void LoadConfig(string configFile);

  void PrepareConfigWindow(IMainConfigInterop configInterop);
}
Run Code Online (Sandbox Code Playgroud)

当然,这个选项更具限制性和更安全性,因为您可以完全限制插件如何与配置窗口交互.


Kri*_*r L 7

我执行处理完全相同的问题(因为dll文件无法读取其配置文件)的方式是我为插件定义了两个接口IPlugin,为主机定义了一个接口IHost.该插件是通过对主机的引用(实现IHost接口)创建和初始化的.

interface IHost {
     string[] ReadConfiguration(string fileName);
}

interface IPlugin {
     void Initialize(IHost host);
}

class MyPlugin : IPlugin {
     public void Initialize(IHost host) {
         host.ReadConfiguration("myplygin.config");
     }
}
Run Code Online (Sandbox Code Playgroud)

IHost然后,您可以在所有插件之间提供所需的任何常用功能(如读取和写入配置),并且插件也更加了解您的主机应用程序,而不会被锁定到特定的主机应用程序.例如,您可以编写一个Web Service应用程序和一个使用相同插件API的Forms应用程序.

另一种方法是使用主机应用程序读取的配置信息初始化插件,但是,我需要插件能够读取/写入其配置,并根据需要执行其他操作.


Pau*_*sik 1

我建议看看Castle Windsor DI/IoC 框架如何处理您所追求的额外要求,也许考虑使用它。

但一般来说,您的插件应该支持接口、属性或构造函数,您可以通过它们从公共源(例如 app.config 文件)注入配置对象。