У меня есть несколько сервисов, которые я внедряю с помощью DI в приложение ASP.Net Core. Эти сервисы используют пару доступных для записи объектов конфигурации, которые я также добавляю с помощью DI. Однако, поскольку эти службы должны быть одиночными, объект конфигурации передается только при запуске службы, поэтому любые изменения в нем не будут приняты. Поэтому мне нужно либо перезапустить эти синглтоны, либо каким-то образом передать им новый IOptionsSnapshot
.
Чтобы уточнить, вот мой код:
Startup.cs:
//Inject service and config object
services.ConfigureWritable<DataSettings>(Configuration.GetSection("DataSettings"));
services.AddSingleton<IHostedService, DataService>();
DataService.cs:
public DataService(IOptionsSnapshot<DataSettings> data)
{
//_options is used to configure the service
this._options = data.Value;
}
DataController.cs:
public DataController(IWritableOptions<DataSettings> data)
{
_data = data;
}
[HttpPost("conf/data/new")]
public void InsertData([FromBody] IEnumerable<ModuleSettings> newData)
{
var data = _data.Value.Data.ToList();
data.AddRange(newData.ToList());
_data.Update(d => d.Data = data.ToArray());
}
Как видите, я настроил свою службу с помощью объекта конфигурации в Startup.cs. Затем я передаю объект конфигурации как своей службе, так и контроллеру, используемому для настройки службы. Интерфейс IWritableOptions
является производным от IOptionsSnapshot
и может использоваться для обратной записи изменений в appsettings.json. Все это работает, однако, когда я вношу изменения в свой объект конфигурации и обновляю appsettings.json, изменения не передаются в мою службу. Было бы излишним перезапускать все приложение, поэтому я ищу способ просто перезапустить эту одну службу или как-то установить в ней объект конфигурации. Я не могу раскрыть свойство _options
службы, потому что эти службы настроены динамически, поэтому в фоновом режиме могут работать 2, 3 и т. Д.