如何在.net core和.netframework的.netstanard库中使用System.Configuration.ConfigurationManager

Man*_*anu 13 c# .net-framework-version asp.net-core .net-standard

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

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

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

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

wei*_*hch 7

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

至于 ASP.Net Core,请查看Microsoft.Extensions.Configuration


mas*_*son 6

正如我所说,您不应该直接依赖于如何在类库中获取配置。保持您的类库灵活。

不要在类库中执行此操作:

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 });
    }
}
Run Code Online (Sandbox Code Playgroud)

通过直接在类库中使用 ConfigurationManager,您已将该类绑定为仅允许一种形式的获取连接字符串。这意味着如果您想使用 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 });
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以在使用应用程序中获取所需的连接字符串。

在 .NET Core 应用程序中,您可以执行以下操作以通过 Microsoft.Extensions.Configuration 从 appsettings.json 获取连接字符串:

string connectionString = Configuration.GetConnectionString("MyDatabase");
MyDatabaseRepository repository = new MyDatabaseRepository(connectionString);
repository.UpdateProductName(1, "Transformer");
Run Code Online (Sandbox Code Playgroud)

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

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

依赖注入相结合,这成为一个非常灵活和强大的工具。