插件使用自己的app.config

时间:2009-05-08 09:16:42

标签: c# plugins settings app-config

我终于设法在这里的一些人的帮助下构建了一个插件架构的工作解决方案,但现在又出现了一个新问题。

我的托管应用程序使用它的app.config文件来执行程序集(这是一个Windows服务)的某些默认值。

每个插件都应该能够从单独的插件设置文件加载自己的设置,因为主机不应该知道插件设置。在插件项目中,我还添加了一个app.config文件(带有一些设置和一个连接字符串),这样我就可以实例化Properties.Settings类并在插件代码中使用它的属性。

问题是当我更改插件的app.config中的设置(构建为plugin.dll.config)时,我无法在插件本身看到这些更改,它仍然使用设计时设置。

有没有办法在每个插件中加载app.config设置,以便生成的Properties.Settings类可以工作?如果没有,还有另一种方法可以将基于app.config的设置文件加载到插件中吗?我打算在IPlugin界面中添加一个LoadConfiguration方法,这样每个插件都会加载它自己的设置。

6 个答案:

答案 0 :(得分:3)

你正在反对app.config的架构。每个可执行文件都有一个app.config文件(EXE,而不是DLL)。可执行文件启动,创建其AppDomain,然后加载MyApp.exe.config。您可以在Visual Studio中添加所需的app.config对象,但DLL会忽略它们。我想你想要做的是手动从dll.config复制XML并将其粘贴到应用程序级app.config中。 (我确信有一种方法可以使用TeamBuild或其他类似的方法自动执行此操作。)然后,您的Properties.Settings类可以使用被覆盖的值。

答案 1 :(得分:2)

ConfigurationManager.OpenMappedExeConfiguration 之类的东西会有帮助吗?您可以创建一个Configuration对象,读取特定文件的值。

答案 2 :(得分:2)

我更喜欢构建和使用IConfigManager类型插件。它的工作是抽象配置的存储方式。您通过依赖注入接收它的实例。这样,IConfigManager实现可以从多个.config文件,网络,数据库或任何其他源加载设置。我还使用它来提供基于用户,机器和/或应用程序的默认值 - 用户可以覆盖默认值,例如背景颜色,字体等。

此方法的其他优点是可以在所有插件中以一致的方式保持设置 - 无需插件,插件存储其设置的位置可以透明地更改(从.config到其他插件),最后,可以在单元测试期间模拟IConfigManager来模拟不同的情况。

我希望有所帮助。

答案 3 :(得分:1)

我是Erik的同事。由于未来几周他将度过一个当之无愧的假期,我将在这个问题上详细阐述。

在我们的插件中,我们使用多个WCF服务客户端实例。这些服务的巧妙之处在于它们带有app.config部分,您可以使用它们来配置行为,服务类型,安全性等。

现在,当我们加载插件时,配置中缺少这些部分,因此无法找到正确的端点。当然我们可以在代码中设置它们,但是那种打击能够在需要时设置其他配置选项。例如,我们可能想要实现ws-security。

因此我们需要一种方法来加载这些配置,以便插件可以在那里读取各自的设置。我们当然可以将所有配置合并为一个,但这种方式消除了“只是插件”方法,因为您必须在插件安装的同时管理配置。

我考虑创建一个小工具,它将'master'配置与放置在项目子目录中的所有配置合并,并用该命令替换.exe.config文件。我认为这样可行,但我想知道.NET是否提供更好的选择。多个AppDomain不是可行的,因为插件必须相互交互(提供者/消费者模型),我们不想仅仅因为这个问题而切换到远程处理。

更新:我通过使用ConfigurationManager打开现有配置来修复大多数问题来阅读appSettings。至于WCF客户;您可以在此处找到服务器和客户端的端点/绑定配置:http://weblogs.asp.net/cibrax/archive/2007/10/19/loading-the-wcf-configuration-from-different-files-on-the-client-side.aspx

答案 4 :(得分:1)

您可以让每个插件读取它自己的ConfigurationSection,然后在主配置文件中使用ConfigSource设置指向外部文件。 (有关详细信息,请参阅此link

您没有完全逃脱主app.config文件中的插件配置信息,但至少插件特定设置位于不同的文件中。

答案 5 :(得分:0)

我通常更喜欢通过创建一个专用的Xml文件来避免整个app.config混乱,该文件主机也会使用插件的设置进行处理。 Xml看起来像这样:

<root>
    <Settings>
        Here's where anything specific to the app goes.
    </Settings>
    <plugins>
        <plugin type="mylibrary.myclass">
            Here I let the plugin serialize itself however it wants to.
        </plugin>
    </plugins>
</root>

主机应用程序然后从类型属性创建插件,并测试该类是否实现 ISerializable ;如果是,那么插件将反序列化自己。让插件与应用程序的设置内联有点可怕,但如果您将插件的Xml子串加载到新的 XmlReader 中,那么您不必担心插件中的错误在Xml字符串中太远了。