【问题标题】:How do I get a connection string in a .net core standard class library from the configuration file in a .net core 2.0 web app?如何从 .net core 2.0 Web 应用程序的配置文件中获取 .net core 标准类库中的连接字符串?
【发布时间】:2019-07-05 23:39:53
【问题描述】:

我有 .net 核心标准类库,它本质上是一个 DAL,有几个类方法可以从数据库返回集合和对象。连接字符串位于 ASP.net 2 核心 Web 应用程序的 appsettings.json 文件中。我还想从控制台应用程序项目中访问这个类库,其中带有连接字符串的配置文件将出现在该控制台应用程序项目中。

这在 .net 核心之前的 .net 中很简单。 DAL 类库将只从 Web 项目访问 web.config 并从控制台应用程序访问 app.config,因为它在 Web 应用程序和控制台应用程序中都引用了该库。但这似乎根本不可能。

我正在 .net 核心中寻找简单的解决方案,以根据具体情况从 Web 应用程序或控制台应用程序获取连接字符串。

【问题讨论】:

    标签: asp.net-core configuration class-library


    【解决方案1】:

    你可能出错的地方是你想从你的类库中访问配置,但是你想泄露关于调用者的详细信息(它将有一个 web.config)。

    但是,如果您决定在 Web 应用程序中使用 Azure Key Vault 或其他机密机制,该怎么办?您的类库是否需要更改其整个实现以使用 Key Vault?那么这是否意味着您的控制台应用程序也别无选择只能使用 Key Vault?

    所以解决方法是使用依赖倒置。简而言之,假设我有如下代码:

    interface IMyRepositoryConfiguration
    {
        string ConnectionString {get;}
    }
    
    class MyRepositoryConfiguration : IMyRepositoryConfiguration
    {
        public string ConnectionString {get;set;}
    }
    
    class MyRepository
    {
        private readonly IMyRepositoryConfiguration _myRepositoryConfiguration;
    
        public MyRepository(IMyRepositoryConfiguration myRepositoryConfiguration)
        {
            _myRepositoryConfiguration = myRepositoryConfiguration;
        }
    }
    

    现在在我的 startup.cs 中,我可以执行以下操作:

    services.AddSingleton<IMyRepositoryConfiguration>(new MyRepositoryConfiguration {//Set connection string from app settings etc});
    

    现在我的类库不需要确切知道这些配置字符串是如何存储的或如何获取它们的。只是如果我请求一个 IMyRepositoryConfiguration 的实例,它将在那里具有值。

    当然,您也可以使用 Options 类,但我个人更喜欢 POCO。更多信息在这里:https://dotnetcoretutorials.com/2016/12/26/custom-configuration-sections-asp-net-core/

    【讨论】:

      【解决方案2】:

      在 .Net 核心中很容易访问“连接字符串”或其他配置数据,而不需要太多额外的努力。

      只是配置系统已经发展(变得更好),我们也必须考虑到这一点(并遵循推荐的做法)。

      在您的情况下,当您访问标准库中的连接字符串值(旨在被重用)时,您不应假设配置值将如何“馈送”给您的类。这意味着您不应该编写代码直接从配置文件中读取连接字符串 - 而是依赖依赖注入机制为您提供所需的配置 - 无论它是如何提供给您的应用程序的。

      一种方法是“要求”将 IConfiguration 对象注入到您的类构造函数中,然后使用 GetValue 方法检索相应键的值,如下所示:

      public class IndexModel : PageModel
      {
          public IndexModel(IConfiguration config)
          {
              _config = config;
          }
      
          public int NumberConfig { get; private set; }
      
          public void OnGet()
          {
              NumberConfig = _config.GetValue<int>("NumberKey", 99);
          }
      }
      

      在 .net core 中,在配置和启动应用程序之前,会配置并启动一个“主机”。主机负责应用启动和生命周期管理。应用程序和主机都使用各种“配置提供程序”进行配置。主机配置键值对成为应用程序全局配置的一部分。

      配置源按照启动时指定的配置提供程序的顺序读取。

      .Net core 支持各种“提供者”。 Read this article for complete information on this topic.

      【讨论】:

      • 太棒了,完全明白,我看到了优势。谢谢!
      猜你喜欢
      • 2018-12-20
      • 2017-03-06
      • 1970-01-01
      • 2021-10-18
      • 2018-05-28
      • 1970-01-01
      • 2017-04-04
      • 2019-06-18
      相关资源
      最近更新 更多