Как и другие, я не согласен с внедрением 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);
}