Новый контекст БД внутри BackgroundService
Всем привет!
Фоном прослушивается Discord, оттуда последовательно приходят картинки.
А в MSSQL уже есть данные кому отдавать картинки с ID скажем.
DiscordMessageService не должен создаваться при каждом запросе, в этом нет никакой нужды, к нему не обращаются одновременно из разных потоков. И инициализация у него очень долгая. А на другой стороне чат-бот, так что это не вариант. MyDbContext - обязан быть Scoped, тк в основном потоке обращения к БД идут с разных потоков и возможно одновременно.
Но нужно в самом сервисе который слушает, менять данные в БД, но невозможно использовать scoped внутри singlton. Наверняка есть очевидный выход, но я не знаю какой.
public class DiscordMessageService : BackgroundService
{
private readonly DiscordSocketClient _discordClient;
private readonly MyDbContext _dbContext;
public DiscordMessageService( DiscordSocketClient discordClient, MyDbContext _dbContext)
{
_discordClient = discordClient;
_discordClient.MessageReceived += Client_MessageReceived1;
}
private async Task Client_MessageReceived(SocketMessage message)
{
var data = await _dbContext.Entity.FirstOrDefaultAsync(e => e.Prompt == prompt); // -- Хочу немного данных получить ))
return;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
await Task.Delay(-1, stoppingToken);
}
}
В Startup.cs
services.AddHostedService<DiscordMessageService>();
services.AddDbContext<MyDbContext>(options =>
options.UseSqlServer(_configuration.GetConnectionString("DefaultConnection")),ServiceLifetime.Scoped);
Как мне получать данные из БД в моем обработчике тогда? Спасибо.