【问题标题】:Dynamic use of multiple config files in C# application在 C# 应用程序中动态使用多个配置文件
【发布时间】:2017-10-05 22:01:20
【问题描述】:

我在这方面做了很多研究,尝试了很多方法,但我开始认为我想做的事情做不到。也就是说——我正在构建一个将被多个客户端使用的应用程序。每个客户端都有自己的数据库连接要求,以及用于控制应用程序某些行为的自定义设置。

我想做的是为每个单独的客户端创建一个 .config 文件,然后使用一个命令行参数来指定要加载的 .config 文件。每个配置文件都有自己的部分,以及自己的 .我浏览了很多关于 ConfigurationManager 和 Configuration 类的文档,并尝试了许多不同的方法,但都失败了。

基本问题是“当我打开一个 .config 文件时,我如何告诉应用程序将此 .config 设为默认配置?”例如,当我稍后引用 appSettings 中的值或数据库连接字符串时,如何确保这些引用将每个映射到我已加载的自定义配置,而不是 Visual Studio 默认创建的配置?

我找到了各种关于加载配置文件的引用,但没有任何内容告诉我如何用我刚刚加载的文件动态替换标准文件。我总是以空引用异常告终,并一头扎进砖墙。

【问题讨论】:

  • 为什么要使用配置文件?为什么不将配置存储在数据库中?您不能将其锁定为程序集名称的 app.config 替换。但是您可以在启动时加载特定的配置文件,并通过单例等方式让整个应用程序访问该文件。
  • 根据您拥有的项目/客户端数量,一种简单的方法是只使用一个配置,并在每个应用设置的键前面加上客户端 ID。然后访问带有前缀键字符串的应用设置项:'CLIENT1-ConnectionString''CLIENT2-ConnectionString',等等...
  • 您不能告诉 .net 应用程序使用另一个 .config 文件。也许一个小型引导应用程序可以将 .config 文件复制到适当的位置,但您肯定会争取访问权。 refer to another file 的选项听起来没什么用。请考虑这不是您真正想要的功能。您的客户确实在您不知情的情况下自行修改此文件,可能在您停止关注很久之后。
  • 将所有客户的连接字符串存储在一个配置文件中,所有客户都可以访问,这听起来是个坏主意。在构建应用程序时使用配置文件转换为特定客户生成 Web.config:stackoverflow.com/questions/34735132/…

标签: c# config app-config


【解决方案1】:

您可以在配置文件中定义多个连接字符串,然后按名称引用它们。 示例:

<configuration>
    <connectionStrings>
       <add name="client1Connection"
            connectionString="Data Source=(local);Initial Catalog=dbclient1;Integrated Security=True"
            providerName="System.Data.SqlClient" />
       <add name="client2connection"
            connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=dbclient2;Integrated Security=True"
            providerName="System.Data.SqlClient" />
       ...
     </connectionStrings>
</configuration>

您可以通过以下方式在您的 c# 代码中引用它们:

string client1ConnStr = System.Configuration.ConfigurationManager.ConnectionStrings["client1Connection"].ConnectionString;
string client2ConnStr = System.Configuration.ConfigurationManager.ConnectionStrings["client2connection"].ConnectionString;

【讨论】:

  • 我了解一个配置文件中的多个连接字符串,以及如何使用它们。多年来我一直在用 C# 编写 Web 应用程序,但这不是 Web 应用程序。
  • 不,这正是我的建议。它不仅限于 Web 应用程序,您也可以在 app.config 中使用它。我们有类似的情况,应用程序仅传递一个客户端 ID。然后,我们有一个到配置数据库的连接字符串。然后,我们可以从配置数据库中的表中查找客户端连接字符串。一旦我们连接到客户端数据库,每个客户端都有一个配置表,用于存储他们自己唯一的配置值。
  • 它与 Web 应用程序无关。我有纯粹基于控制台的应用程序,其中包含用于连接到多个数据库的设置。
  • @Andrew Harris:我明白你的建议,虽然它会涉及额外的复杂性,但它会起作用。我将无法使用标准的 ConfigurationManager 东西,这使它不那么优雅。该应用程序将拥有自己的支持数据库,因此我可以将所有配置数据塞入其中,包括连接字符串。然后这些连接字符串将指向用户数据库,我可以存储任意数量的唯一配置值。这不是我所希望的,但它是完全可行的。也许 MS 将来会添加类似的东西(也许是 .NET 9)。
  • 关于不使用内置的 ConfigurationManager 类...它们并不是特别复杂。在我之前提到的应用程序中,我们构建了我们自己的等效管理器工厂,它允许您只要求一个特定的配置选项,它会给您一个键入的值。尽情发挥您的想象力吧。
猜你喜欢
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多