在我的解决方案(.NET Core 2.0)中,我有一个WebApi项目和一个类库Services项目。我想在我的一个服务中访问我的WebApi项目的appsettings.json文件中的值。例如,本节中的内容。
"ThirdPartyApi":
{
"ApiUrl": "xxx",
"ApiVersion": "xxx",
"ApiNamespace": "xxx",
"ApiKey": "xxx",
"Client": "xxx",
"ClientVersion": "xxx"
}
从我所见,我可以通过两种方式做到这一点:
在我的服务中注入IConfiguration _config并访问如下所示的值:
_config["ThirdPartyApi:ApiUrl"]
创建一个ThirdPartyApiSettings类,其属性映射到设置部分,如下所示:
services.Configure<ThirdPartyApiSettings(Configuration.GetSection("ThirdPartyApi"));
并在我的服务类中注入IOptions<ThirdPartyApiSettings> _apiSettings
并通过类属性访问设置,如下所示:
_apiSettings.ApiUrl
那么,两者之间是否有首选方式?或者当一个人应该选择其中一种方法而不是另一种方法时的特定用例?
答案 0 :(得分:2)
注入IConfiguration
是一种反模式。您应该创建一个强类型类并注入它。正如@Steven在评论中指出的那样,IOptions<T>
是多余的,但注入IOptionsSnapshot<T>
是有价值的,因为它会响应配置重新加载。您还可以充分利用这两个世界,并将强类型类实例注册为IOptionsSnapshot<T>
的函数,这样您就可以注入类似ThirdPartyApi
的内容,但仍然可以获得配置更新:
services.Configure<ThirdPartyApi>(Configuration.GetSection("ThirdPartyApi"));
services.AddTransient(p => p.GetRequiredService<IOptionsSnapshot<ThirdPartyApi>>().Value);
请注意,使用该方法,设置将限定为它们注入的对象。例如,如果您注入单个实例,它们将永远不会被重新加载,因为更新只会在注入期间发生。如果您想确保始终使用最新的配置,则应直接注入IOptionsSnapshot<T>
并每次访问Value
属性以获取配置值。