如何在 .net core 和 .net framework 中使用 System.Configuration.ConfigurationManager 的 .netstandard 库?

13

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

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

.netstandard 中是否有 System.Configuration.ConfigurationManager 的替代选项。

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


5
如果你在做一个库,尽可能避免直接访问配置文件。取而代之的是,你的库类应该期望由托管应用程序将其需要的配置传递给它们。这样可以使你的库更加灵活,并且不会将你绑定在任何特定的实现上。这可能需要一些重构,但不应该太困难。 - mason
@mason 你有任何示例或示例链接吗? - Manu
你也可以将你的配置绑定到一个 POCO 类上,并传递它,这样你就不必在每个地方都依赖于配置。 - sommmen
3个回答

7

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

如果在您的类库中直接使用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 });
    }
}

现在这样可以让你在使用应用程序中以任何想要的方式获取连接字符串。
在 .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");

配合依赖注入,这将成为一个非常灵活且强大的工具。

3

感谢这个答案:https://dev59.com/pVYM5IYBdhLWcg3wlQwi#54259119

如果您检查调用ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)的结果;

我在一个 .Net 5 Web 项目中添加了 ProjName.dll.config,这使得 NetStandard2.0 项目能够从 ConfigurationManager.ConnectionStrings["x"] 和 ConfigurationManager.AppSettings["y"] 获取配置值。

虽然这显然不是开发新代码的正确方式,但这使我们能够进行大规模的 .Net Framework 迁移到 .Net 6。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接