【问题标题】:How to use System.Configuration.ConfigurationManager in .netstanard library for .net core and .netframework如何在 .net 标准库中为 .net core 和 .netframework 使用 System.Configuration.ConfigurationManager
【发布时间】:2020-05-01 21:20:58
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果你在做一个库,尽量避免访问配置文件。相反,您的库类应该期望通过托管应用程序将所需的配置传递给它们。这使您的库保持灵活,并且不会将您束缚于任何特定的实现。这可能需要一些重构,但应该不会太糟糕。
  • @mason 你有任何例子或例子的链接吗?
  • 你也可以将你的配置绑定到一个 POCO 类并传递它,这样你就不会到处都有配置依赖

标签: c# asp.net-core .net-standard .net-framework-version


【解决方案1】:

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

ASP.Net Core 看Microsoft.Extensions.Configuration。

【讨论】:

    【解决方案2】:

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

    不要在你的类库中这样做:

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

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

    【讨论】:

      猜你喜欢
      • 2021-08-12
      • 1970-01-01
      • 2018-03-29
      • 2017-09-18
      • 2017-10-20
      • 2020-11-17
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多