将外部配置文件用于多个项目中的连接字符串

时间:2018-11-04 21:07:21

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

我想知道在我的解决方案中是否有更好的方法在外部文件中使用连接字符串,因为我的解决方案有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的另一 type 类型,通常用于将这些连接字符串加载到解决方案中,从而满足我的要求?

2 个答案:

答案 0 :(得分:1)

尽管这个问题已有一年多的历史了,但我认为对于希望引用项目文件夹的app.config等之外的连接字符串的任何Windows桌面编码器而言,最新的答案将非常有用。这对于共享1多个项目的配置文件,只需更改1个集中文件中的连接字符串即可。

告诉App.Config为连接字符串使用其他文件的基本原理很简单;但是,如果.NET在项目的根文件夹中为 NOT 或该项目中的子文件夹为 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中列出的。视觉工作室;确保将其标记为COPY到输出文件夹(我使用“如果更新则复制”,在重建项目后,它将仅对外部配置文件 进行任何更改)。

这回答了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);
                    }
                }
            }

这当前在Windows 10上的Visual Studio 2019中与WPF应用程序.NET Core 3.1一起使用。

答案 1 :(得分:0)

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

我认为这可以解决您的问题,因为您无需在项目之间跟踪任何其他文件,并且我认为这很有意义,因为任何开发人员都不会看到任何安全数据,也不会将其存储在任何存储库中。最初设置时,只有开发人员会知道。而且,这使您更接近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

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

希望您觉得这有用。