为每个客户端程序集分别进行类库初始化

时间:2016-07-01 14:58:28

标签: c# class-library

我正在为第三方应用程序编写一组插件,这些插件实现为.NET库并在应用程序启动时加载,因此它们都在同一个应用程序域中。其中一个库是其他人使用的实用程序类和扩展方法的集合(包括其他人编写的插件,因此这基本上是一个元库)。

问题是:在实用程序库中有一个初始化代码,允许设置插件标题等内容;显然,应该按客户端设置,即在这种情况下按库。当然,这不能使用静态配置类来实现,因为在域中只有它的单个实例。

我也不允许在其他插件中动态地将此库加载到单独的域中;这将是对记忆的浪费,这是一个值得关注的问题。

问题

  1. 为其他库实现这样的每个客户端运行时配置是否可行/合理?
  2. 如果是,您会推荐什么方法?

1 个答案:

答案 0 :(得分:1)

我不确定我是否正确理解了这个问题,但您似乎建议有一个应用程序在启动时加载插件dll。您(应用程序开发人员和潜在的插件开发人员)希望提供一个具有实用程序功能的静态类,插件可以使用,而无需为每个插件“重新创建轮子”。以下是我的评估(基于以上理解)

  • 您的实用程序类似乎存储了插件特定数据 - 因此根据定义它不能是静态的
  • 是的,您可以加载特定于插件的配置文件(文件名可能必须遵循命名约定以便由静态函数轻松加载)并提供实用程序服务 - 但我会说这是一个糟糕的设计
  • 我宁愿提供一个不存储任何插件特定数据的实用程序,而只是提供基于方法参数的服务。如果你看到自己多次向实用程序传递相同的参数,那么你应该将这些参数封装到它自己的类/结构中(比如PluginData?)

修改

让我对上面指定的第3种方法进行一些扩展:

您可以使用类来代表您的插件配置,如下所示,或者您可以获得更高级的。

class PluginConfiguration {
    public string PluginName {get; private set;} // This represents a property that all plugins share i.e. well known properties

    // all the configurations "private" to the plugin can go here
    // You might want to use some XmlDocument or a different data structure for this purpose
    public Dictionary<string,string> ConfigItems {get; private set;}

    public PluginConfiguration(string configFile) {
        // Load the configuration from the config file
    }   
}

现在,您的实用程序库可以传递参数或返回PluginConfiguration类型的数据,并帮助您集中插件的所有重复代码