与其他人一样,我不同意将 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);
}