Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection 在服务中访问appsetting值的最佳方法_Dependency Injection_Configuration_Asp.net Core 2.0_Appsettings - Fatal编程技术网

Dependency injection 在服务中访问appsetting值的最佳方法

Dependency injection 在服务中访问appsetting值的最佳方法,dependency-injection,configuration,asp.net-core-2.0,appsettings,Dependency Injection,Configuration,Asp.net Core 2.0,Appsettings,在我的解决方案(.NET Core 2.0)中,我有一个WebApi项目和一个类库服务项目。我想在我的一个服务中访问WebApi项目的appsettings.json文件中的值。例如,本节中的内容 "ThirdPartyApi": { "ApiUrl": "xxx", "ApiVersion": "xxx", "ApiNamespace": "xxx", "ApiKey": "xxx", "Client": "xxx", "ClientVersio

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

"ThirdPartyApi":
{
    "ApiUrl": "xxx",
    "ApiVersion": "xxx",
    "ApiNamespace": "xxx",
    "ApiKey": "xxx",
    "Client": "xxx",
    "ClientVersion": "xxx"
}
据我所见,我可以通过两种方式做到这一点:

  • 在我的服务中插入IConfiguration\u config并访问如下值:

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

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

  • 那么,在这两者之间有没有更好的方法呢?或者当一个人应该选择其中一种方法而不是另一种方法时的特定用例?

    注入
    IConfiguration
    是一种反模式。您应该创建一个强类型类并将其注入。正如@Steven在评论中指出的,
    IOptions
    有点多余,但是注入
    IOptionsSnapshot
    是有价值的,因为这将响应配置重新加载。您还可以充分利用这两个方面的优势,将强类型类实例注册为
    IOptionsSnapshot
    的函数,这样您就可以注入类似
    ThirdPartyApi
    的内容,但仍然可以获得配置更新:

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

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

    注入
    IConfiguration
    是一种反模式。您应该创建一个强类型类并将其注入。正如@Steven在评论中指出的,
    IOptions
    有点多余,但是注入
    IOptionsSnapshot
    是有价值的,因为这将响应配置重新加载。您还可以充分利用这两个方面的优势,将强类型类实例注册为
    IOptionsSnapshot
    的函数,这样您就可以注入类似
    ThirdPartyApi
    的内容,但仍然可以获得配置更新:

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

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

    实际上还有第三个选项:具有属性的ThirdPartyAppSettings类,并将该设置类注入到需要它的服务组件中;不要注入
    IOptions
    。它没有任何功能。@Steven我只能这样做:
    private readonly ThirdPartyApiSettings\u apiSettings;public MyService(IOptions apiSettings){{u apiSettings=apiSettings.Value;}
    这是否可能:
    public MyService(ThirdPartyApiSettings apiSettings){{u apiSettings=apiSettings;}
    ?如果是这样的话,我怀疑我在Startup.cs中缺少了一些配置,因为我无法让它工作。您不需要任何设置。只需在启动时加载
    ThirdPartyApiSettings
    ,并将其注册为Singleton到容器中。比使用选项容易得多。实际上还有第三个选项:ThirdPartyAPiSettings类和属性,并将该设置类注入到需要它的服务组件中;不要注入
    IOptions
    。它没有任何功能。@Steven我只能这样做:
    private readonly ThirdPartyApiSettings\u apiSettings;public MyService(IOptions apiSettings){{u apiSettings=apiSettings.Value;}
    这是否可能:
    public MyService(ThirdPartyApiSettings apiSettings){{u apiSettings=apiSettings;}
    ?如果是这样的话,我怀疑我在Startup.cs中缺少了一些配置,因为我无法让它工作。您不需要任何设置。只需在启动时加载
    ThirdPartyApiSettings
    ,并将其注册为Singleton到容器中。比使用选项容易得多。你能详细说明一下“注入IConfiguration是一种反模式”吗?“反模式是对经常出现的问题的一种常见反应,通常是无效的,并且有可能产生严重的反效果。”我怀疑与此相关的风险。我想更具体地知道这些问题可能是什么。以及为什么/如何无效。我想到的唯一一件事是,通过注入IConfiguration,我可以让我的服务访问比它需要知道的更多的数据。“如果你想确保你一直在使用最新的配置,你应该直接注入ioptionssnapshot”。相反,只需确定注册范围;这就避免了让应用程序代码依赖于IOptionsSnapshot的需要。是和否。作用域实际上会阻止您注入到单例中,因此它的副作用是始终有效地重新加载,因为设置通常不会在请求的上下文中更改。但是,如果需要注入到单例中,如果要获取最新配置,则必须始终使用
    IOptionsSnapshot
    。Scoped在技术上解决不了任何问题。您能详细说明一下“注入IConfiguration是一种反模式”吗?“反模式是对经常出现的问题的一种常见反应,这种问题通常是无效的,并且可能会产生严重的反作用。”我怀疑这会带来风险。我想更具体地知道那些专业人士