Эта служба должна выполнять повторяющиеся задачи, например, записать данные в базу данных. Для этого мне нужен мой dbcontext, который зарегистрирован как сервис Scoped. Это имеет смысл, так как служба общежития не может быть разрешена из Синглтона. Итак, как правильный способ сделать это?
Код: Выделить всё
while (!stoppingToken.IsCancellationRequested)
{
using (var scope = _serviceProvider.CreateScope())
{
var dbContext = scope.ServiceProvider.GetRequiredService();
// ... work with the dbContext ...
}
await Task.Delay(TimeSpan.FromMinutes(5), stoppingToken);
}
< /code>
Класс фоновой службы синглтона - что -то вроде: < /p>
public class MySingletonBackgroundService : BackgroundService
{
private readonly ILogger _logger;
private readonly IServiceScopeFactory _scopeFactory;
public MySingletonBackgroundService(ILogger logger, IServiceScopeFactory scopeFactory)
{
_logger = logger;
_scopeFactory = scopeFactory;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("Background service is starting.");
while (!stoppingToken.IsCancellationRequested)
{
using (var scope = _scopeFactory.CreateScope())
{
var dbContext = scope.ServiceProvider.GetRequiredService();
_logger.LogInformation("Doing work with a scoped DbContext.");
// Do the work here
}
await Task.Delay(TimeSpan.FromSeconds(30), stoppingToken);
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... d-services
Мобильная версия