如何在 .net 核心和 .net 框架的 .net 标准库中使用 System.Configuration.ConfigurationManager

How to use System.Configuration.ConfigurationManager in .netstanard library for .net core and .netframework

我正在将 .netframework 4.7.2 class 库迁移到 .netstandard 2.0 库。

ConfigurationManager 在 .netframework class 库中用于读取应用程序设置。

.netstanard 中 System.Configuration.ConfigurationManager 可用的任何替代选项。

迁移后的 class 库需要在 .net core web API 和旧的 .netframework web 应用程序中使用。

您可以通过 nuget package 安装 ConfigurationManager,它针对 .Net Standard 2.0。

至于ASP.Net核心,看看Microsoft.Extensions.Configuration

正如我所说,您不应该直接依赖于 class 库中配置的获取方式。保持您的 class 图书馆灵活。

不要在您的 class 图书馆中这样做:

public void UpdateProductName(int productId, string name)
{
    using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDatabase"]))
    {
        connection.ExecuteNonQuery("UPDATE dbo.Products SET Name = @Name WHERE Id = @ProductId", new {  ProductId = productId, Name = name });
    }
}

通过在 class 库中直接使用 ConfigurationManager,您已将 class 绑定为仅允许一种获取连接字符串的形式。这意味着如果你想使用 appsettings.json、环境变量、KeyVault 或任何其他获取配置的方法,你不能。

相反,这样做:

public class MyDatabaseRepository
{
    readonly string _connectionString;

    public MyDatabaseRepository(string connectionString)
    {
        _connectionString = connectionString;
    }
} 

public void UpdateProductName(int productId, string name)
{
    using (var connection = new SqlConnection(_connectionString))
    {
        connection.ExecuteNonQuery("UPDATE dbo.Products SET Name = @Name WHERE Id = @ProductId", new {  ProductId = productId, Name = name });
    }
}

现在,您可以在消费应用程序中随心所欲地获取连接字符串。

在 .NET Core 应用程序中,您可以通过 Microsoft.Extensions.Configuration:

从 appsettings.json 获取连接字符串
string connectionString = Configuration.GetConnectionString("MyDatabase");
MyDatabaseRepository repository = new MyDatabaseRepository(connectionString);
repository.UpdateProductName(1, "Transformer");

它仍然允许您在 .NET Framework 应用程序中灵活地使用 System.Configuration:

string connectionString = ConfigurationManager.ConnectionStrings["MyDatabase"].ConnectionString;
MyDatabaseRepository repository = new MyDatabaseRepository(connectionString);
repository.UpdateProductName(1, "Transformer");

结合 Dependency Injection,这将成为一个非常灵活和强大的工具。