c# - 在 ASP .NET Core 2.1 中注入配置值
问题描述
与其他人一样,我不同意将 IOptions 注入可能需要它的每个服务中,并寻找其他选项。我的目标是注入服务所需的值,仅此而已。我想出了以下内容,它可以工作且功能正常,但它是否可靠且可维护?似乎太简单和有效,就像我错过了一些东西。
要求:
- 加载自定义 json 文件
- 强类型
- 不要过度暴露
- 可维护
我想出了以下内容。
public Startup(IConfiguration configuration)
{
var configBuilder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile("myappsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables()
;
Configuration = configBuilder.Build();
}
使用 LAMAR,因此如下:
public void ConfigureContainer(ServiceRegistry services)
{
var config = new MyAppConfig();
Configuration.GetSection("MyAppConfig").Bind(config);
}
我的 json 文件如下所示:
{
"MyAppConfig": {
"AppSettings": {
"Name": "My Application"
},
"DataSettings": {
"PrimaryDB": {
"Name": "DBNAME",
"ConnectionString": "Server=serverAddr.DOMAIN.com;Database=INITIAL_DB_HERE;User Id=MY_APP_USER_NAME;Password=******;MultipleActiveResultSets=true",
"DatabaseName": "DBNAME", // this has a separate use
"Provider": ""
}
}
}
}
要使用它,我只需将配置对象传递给创建服务实例的函数,并仅将需要的内容注入服务。
services.For<IPerformanceService>().Use(c => CreatePerformanceService(config));
private IPerformanceService CreatePerformanceService(IAppConfiguration appConfig)
{
var myRepo = new PerformanceRepository(appConfig.DataSettings.PrimaryDB.ConnectionString, appConfig.DataSettings.PrimaryDB.DatabaseName);
return new PerformanceService(myRepo);
}
解决方案
我不认为这个有一个明确的答案,它更多的是关于你认为对你来说方便的东西。对于我自己,我采取了一种稍微不同的方法。
这是启动:
// Redis Caching
var redisConfiguration = configuration.GetSection("Redis").Get<RedisConfiguration>();
services.AddSingleton(redisConfiguration);
services.AddSingleton<RedisCacheHelper>();
那部分几乎就是你正在做的事情,一个保存配置值的类。请注意,您不需要“绑定”,您可以直接使用 .Get 将配置解析为一个类。
我将我的配置添加到单例中,因此我可以使用常规 DI 将其注入到构造函数中,无论我需要它。在这种情况下,它仅用于 CacheHelper 但我在其他地方使用了多个控制器和中间件的配置。
使用配置只是内部DI然后:
public class RedisCacheHelper
{
public StackExchangeRedisCacheClient Cache {get;set;}
public RedisCacheHelper(RedisConfiguration redisconfig)
{
Cache = new StackExchangeRedisCacheClient(new NewtonsoftSerializer(),redisconfig );
}
}
推荐阅读
- c++ - CardDeck 构造函数
- azure-cosmosdb - 将数据写入另一个 Cosmos DB 的 Cosmos DB 触发器
- r - R Data.Table 将许多列折叠成 1
- ruby-on-rails - 如何将 Active Admin 上的下载 CSV 链接移动到 action_item 栏
- c++ - 使用 QFile 读取多个文件
- python - 如何使用 python 将数据框附加到基于标头的现有 Excel 文件
- c++ - 用于一次性查找但多次遍历和访问的容器的 C++ 有效方法
- reactjs - 如何使用 Express 从 React 中的公共文件夹下载文件
- node.js - 是否可以在 npm 注册表 (fe npmjs.org) 中找出所有现有 npm 模块的总大小?
- azure-ad-b2c - Azure B2C 自定义策略中的多个自定义标头和路径变量