Новый контекст БД внутри BackgroundService

Рейтинг: 0Ответов: 0Опубликовано: 09.04.2023

Всем привет!

Фоном прослушивается 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);

Как мне получать данные из БД в моем обработчике тогда? Спасибо.

Ответы

Ответов пока нет.