如何在 .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,这将成为一个非常灵活和强大的工具。
我正在将 .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,这将成为一个非常灵活和强大的工具。