Назад к вопросам
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-сервисы создаются и уничтожаются корректно для каждого сообщения, избегая проблем с жизненным циклом и утечками ресурсов.