【问题标题】:Using external config file for connection strings in multiple projects在多个项目中为连接字符串使用外部配置文件
【发布时间】:2019-04-08 06:51:50
【问题描述】:

我想知道是否有更好的方法在我的解决方案的外部文件中使用连接字符串,因为我的解决方案有 8 个单独的项目,所有项目都使用相同的连接字符串。据此:

https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/connection-strings-and-configuration-files#using-external-configuration-files

使用外部文件(用于连接字符串)很简单,并且可以轻松完成(使用类似configSource="connections.config 的东西)。但是,为了完成这项工作,我们必须遵循以下准则:

  1. 外部文件必须存在于项目文件夹中
  2. 外部文件必须将“CopyToOutputFolder”属性设置为 true

在我的情况下,这个可以完成,但是在所有 8 个项目中管理这个是有问题的,特别是如果我需要添加一个新的连接字符串,更改其中一个设置(目标数据库,用户名、密码),或者当我需要添加新项目时。

--仅供参考:每个项目都是部署到 Azure 服务器的 Web 作业。为新功能、新实用程序等添加新 Web 作业,或出于多种原因删除旧 Web 作业并不少见。该解决方案不断变化,这增加了在每个项目中单独管理这些设置的难度。此外,生产服务器上的连接字符串管理没有问题,因为每个 Web 作业都从父应用服务继承这些连接字符串。

我想知道以下任何一项是否可行;

  1. 我可以在项目文件夹中使用的单独文件作为连接字符串吗?
  2. 能否将连接字符串动态(在运行时)加载到配置管理器中? (对此有一点说明 - 我知道这是可能,但我需要能够在不影响底层 app.config 文件的情况下做到这一点)
  3. 是否有另一个类型 ConfigurationManager 常用于将这些连接字符串加载到解决方案中,这将满足我的要求?

【问题讨论】:

标签: c# .net web-config connection-string app-config


【解决方案1】:

虽然这个问题已有一年多的历史,但我认为对于任何希望在项目文件夹的 app.config 等之外引用连接字符串的 Windows 桌面编码人员来说,最新的答案都会很有用。这对于共享 1 很有用多个项目的配置文件,只需更改 1 个集中文件中的连接字符串。

告诉 App.Config 为连接字符串使用不同的文件的基本原理很简单;但是,.NET 似乎 NOT 能够解析此外部文件,如果它是在项目的根文件夹中的 NOT 或该项目中的子文件夹。让我们看一下最基本的例子:

在项目的 App.config 中,<configuration> 标签内,使用下面的代码('configSource' 指向另一个文件来读取连接字符串):

<configuration>
  <connectionStrings configSource="ExternalConnectionStrings.config"/>
</configuration>

创建ExternalConnectionStrings.config,代码如下:

<connectionStrings>
<clear/>
    <add name = "ConnString1"
         connectionString = "Server=myServer;Trusted_Connection=True;Database=myDB;Persist Security Info=false"/>
    <add name = "ConnString2"
         connectionString = "Server=tcp:azureserver.database.windows.net,1433;Database=AzureDB;User ID=**;Password=**;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Persist Security Info=false"/>
</connectionStrings>

将此配置文件保存在与项目的App.config 相同的文件夹中,并将此文件的属性标记为“复制到输出目录”或“如果较新则复制”。

这是从App.config 以外的其他文件引用连接字符串的“教科书”方式。但是,这可能没那么有用:如何将此外部文件放在与项目文件夹完全不同的文件夹中?

为此,请将相同的ExternalConnectionStrings.config 复制到项目或解决方案文件夹OUTSIDE 的文件夹中,例如。 C:\ConnectionStringsFolder\。从我们之前复制/创建的项目文件夹中删除此配置文件(否则以下说明将不起作用)。

保持App.config 不变(确保项目文件夹中不存在ExternalConnectionStrings.config)。使用 Windows mklink 命令将 ExternalConnectionStrings.config 关联到外部文件夹,使用以下命令提示符命令:

mklink ExternalConnectionStrings.config C:\ConnectionStringsFolder\ExternalConnectionStrings.config

Windows 应该返回一个“为...创建的符号链接”;确保您没有app.config 所在的项目文件夹中存在该特定配置文件。

您应该会看到ExternalConnectionStrings.config 列在例如。视觉工作室;确保将其标记为复制到输出文件夹(我使用“如果较新则复制”,它将在项目重建后获取对外部配置文件的任何更改ONLY)。

这回答了 Matt Spinks 的问题 1;对于问题 2,以下方法将返回在外部文件中找到的所有连接字符串(如 App.config 所指):

using System.Diagnostics;
using System.Configuration;

    static void GetConnectionStrings()
            {
                ConnectionStringSettingsCollection cStringsSettings = ConfigurationManager.ConnectionStrings;

                if (cStringsSettings != null)
                {
                    foreach (ConnectionStringSettings cstrings in cStringsSettings)
                    {
                        Debug.WriteLine(cstrings.Name);
                        Debug.WriteLine(cstrings.ConnectionString);
                    }
                }
            }

这目前在 Visual Studio 2019 中运行,在 Windows 10 上使用 .NET Core 3.1,一个 WPF 应用程序。

【讨论】:

    【解决方案2】:

    您没有提及您使用的是哪个版本的 dotnet,但是如果您使用的是 dotnet core,则可以从环境变量中获取应用程序配置。

    我认为这可以解决您的问题,因为您不需要在项目之间跟踪任何其他文件,而且我认为这很有意义,因为任何安全数据都不会对任何开发人员可见或存储在任何存储库中.只有 devops 在最初设置它时才会知道它。这也让您更接近 12 因子应用程序https://12factor.net/

    要使用它,请确保您的 Startup.cs 文件包含一个用于加载环境变量的部分,例如

    var config = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json", true, true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true)
        .AddEnvironmentVariables()
        .Build();
    

    dotnet core Environment Variable cnfiguration provider

    您可能可以创建一个 bat 文件来初始设置所有内容

    setx connection_string="Server=xxxxxxxxx" /M
    

    这将创建您的环境变量并设置您指定的值。

    希望你觉得这很有用。

    【讨论】:

    • 谢谢@Leo。我会试一试。但我使用的是 .NET 4.6。对不起,我没有提到。
    猜你喜欢
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2021-11-24
    • 2020-03-17
    • 1970-01-01
    相关资源
    最近更新 更多