首页 > 解决方案 > 在服务中访问 appsetting 值的最佳方式

问题描述

在我的解决方案(.NET Core 2.0)中,我有一个 WebApi 项目和一个类库服务项目。我想在我的一项服务中访问我的 WebApi 项目的 appsettings.json 文件中的值。例如,本节中的那些。

"ThirdPartyApi":
{
    "ApiUrl": "xxx",
    "ApiVersion": "xxx",
    "ApiNamespace": "xxx",
    "ApiKey": "xxx",
    "Client": "xxx",
    "ClientVersion": "xxx"
}

从我所见,我可以通过两种方式做到这一点:

  1. 在我的服务中注入 IConfiguration _config 并访问如下值:

    _config["ThirdPartyApi:ApiUrl"]
    
  2. 创建一个 ThirdPartyApiSettings 类,其属性映射到设置部分,如下所示:

    services.Configure<ThirdPartyApiSettings(Configuration.GetSection("ThirdPartyApi"));
    

    并注入IOptions<ThirdPartyApiSettings> _apiSettings我的服务类并通过类属性访问设置,如下所示:

    _apiSettings.ApiUrl
    

那么,两者之间是否有首选方式?还是应该选择其中一种方法而不是另一种的特定用例?

标签: dependency-injectionconfigurationasp.net-core-2.0appsettings

解决方案


注入IConfiguration是一种反模式。您应该创建一个强类型类并注入它。正如@Steven 在评论中指出的那样,IOptions<T>有点多余,但是 injection 是有价值的IOptionsSnapshot<T>,因为它会响应配置重新加载。您还可以两全其美,并将您的强类型类实例注册为 的函数IOptionsSnapshot<T>,这样您就可以注入类似的东西ThirdPartyApi,但仍然可以获得配置更新:

services.Configure<ThirdPartyApi>(Configuration.GetSection("ThirdPartyApi"));
services.AddTransient(p => p.GetRequiredService<IOptionsSnapshot<ThirdPartyApi>>().Value);

请注意,使用这种方法,设置的范围将限于它们注入的对象。例如,如果你注入一个单例,它们实际上永远不会被重新加载,因为更新只会在注入期间发生。如果要确保始终使用最新的配置,则应直接注入并每次IOptionsSnapshot<T>访问属性以获取配置值。Value


推荐阅读