代码之家  ›  专栏  ›  技术社区  ›  Matt Spinks

在多个项目中为连接字符串使用外部配置文件

  •  0
  • Matt Spinks  · 技术社区  · 7 年前

    我想知道是否有更好的方法在我的解决方案的外部文件中使用连接字符串,因为我的解决方案有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. 我可以动态地(在运行时)将连接字符串加载到配置管理器中吗?(关于这个的一个注释-我知道这是 可能的
    3. 还有别的吗 属于 ConfigurationManager 那就是通常用来把这些连接字符串加载到解决方案中,那能满足我的要求吗?
    1 回复  |  直到 7 年前
        1
  •  1
  •   LJH    6 年前

    尽管这个问题已经有一年多了,但我认为一个最新的答案对于任何想要引用项目文件夹之外的连接字符串的Windows桌面程序员来说都是有用的应用程序配置这对于多个项目共享1个配置文件非常有用,只需更改1个集中文件中的连接字符串。

    讲述的基本原理应用程序配置为连接字符串使用不同的文件是很简单的;但是,.NET出现了 不是 能够解析这个外部文件,如果它是 不是 在项目的根文件夹或该项目中的子文件夹中。让我们看看最基本的例子:

    在项目的应用程序配置,在 <configuration>

    <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

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

    外部nalConnectionString.config 到文件夹 外面 项目或解决方案文件夹,例如。 C:\ConnectionStringsFolder\ . 这个配置文件来自我们之前复制/创建它的项目文件夹(否则以下说明将不起作用)。

    保持 同样的(确保外部nalConnectionString.config项目文件夹中不存在)。使用窗户 mklink 使用以下命令提示符命令将其保存到外部文件夹:

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

    在项目文件夹中存在特定的配置文件,其中 app.config 坐着。

    你应该看看 只有

    这回答了mattspinks的问题1;对于问题2,以下方法将返回外部文件中找到的所有连接字符串(如 应用程序配置 ):

    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);
                        }
                    }
                }
    

    这目前在VisualStudio2019中运行,Windows10上的.NETCore3.1是一个WPF应用程序。

        2
  •  0
  •   Leo Hinojosa    7 年前

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

    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
    

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