dependency-injection - 在服务中访问 appsetting 值的最佳方式
问题描述
在我的解决方案(.NET Core 2.0)中,我有一个 WebApi 项目和一个类库服务项目。我想在我的一项服务中访问我的 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
那么,两者之间是否有首选方式?还是应该选择其中一种方法而不是另一种的特定用例?
解决方案
注入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
推荐阅读
- android - 如何解决将新依赖项添加到 gradle 时导致应用程序崩溃的问题?
- javascript - 将对象转换为具有所需模式的字符串:Javascript
- log4j2 - 使用 log4j2 的 Fargate 日志记录问题
- flutter - 错误:异常:解析资产文件时出错!带有 Advance_pdf_viewer 的 Flutter App
- ruby-on-rails - Rails:将属性添加到控制器中的嵌套属性
- for-loop - 如何在 PL/SQL 中打印此模式
- reactjs - 如何为我的 Stripe 集成编写 Lambda 函数?
- pca - 如何在 PCA 中找到变量和个体的坐标、质量和贡献?
- kubernetes - 为什么我的 vs-code 容器部署到我的 GKE K8s 集群返回“没有最低可用性”
- minecraft-forge - Minecraft Forge 1.16 获得 Blockdamage 进度