Sobes.tech
Назад к вопросам
Senior
5

Как работать со Scoped-сервисами (например, DbContext) внутри Kafka/MassTransit consumer, где нет scope запроса?

Компании, где спрашивали
Сбербанк

Ответ от нейросети

sobes.tech AI

В Kafka/MassTransit consumer нет встроенного scope запроса, поэтому Scoped-сервисы (например, DbContext) нужно создавать вручную внутри обработчика сообщений.

Обычно это делается через внедрение IServiceScopeFactory и создание scope внутри метода потребителя:

public class MyConsumer : IConsumer<MyMessage>
{
    private readonly IServiceScopeFactory _scopeFactory;

    public MyConsumer(IServiceScopeFactory scopeFactory)
    {
        _scopeFactory = scopeFactory;
    }

    public async Task Consume(ConsumeContext<MyMessage> context)
    {
        using var scope = _scopeFactory.CreateScope();
        var dbContext = scope.ServiceProvider.GetRequiredService<MyDbContext>();

        // Используйте dbContext для работы с БД
        // ...

        await dbContext.SaveChangesAsync();
    }
}

Такой подход гарантирует, что Scoped-сервисы создаются и уничтожаются корректно для каждого сообщения, избегая проблем с жизненным циклом и утечками ресурсов.