Каждый сервис использует Entity Framework и SQL.
У меня есть CrudService, который реализует стандартные операции с базой данных:
Код: Выделить всё
public class CrudService : ICrudService where TEntity : class
{
private readonly DbContext _context;
private readonly DbSet _entity;
public CrudService(DbContext context)
{
_context = context;
_entity = context.Set();
}
public virtual IQueryable GetAll() =>
_entity;
....
}
Я зарегистрировал это с помощью стандартного DI-контейнера, который является частью службы Windows. приложение.
Код: Выделить всё
var connectionString = configuration.GetConnectionString("connection");
services.AddDbContextPool(options =>
{
options.UseSqlServer(connectionString);
}, ServiceLifetime.Transient);
services.AddTransient();
services.AddTransient(typeof(ICrudService), typeof(CrudService));
services.AddTransient();
У меня есть обработчики запросов/ответов, которые используют ICrudService, примерно так:
Код: Выделить всё
public class Handler : IResponder
{
private readonly ICrudService _crudService;
public Handler(ICrudService crudService)
{
_crudService = crudService;
}
public async Task CreateResponseAsync(Request request)
{
var results = await _crudService.GetAll()
.ToListAsync();
return ...
}
}
System.InvalidOperationException: была выполнена вторая операция началось
в этом экземпляре контекста до завершения предыдущей операции. Это
обычно вызвано тем, что разные потоки одновременно используют один и тот же
экземпляр DbContext. Для получения дополнительной информации о том, как избежать проблем с потоками
с помощью DbContext
Я пытался изменить регистрацию DI на Scoped, но безуспешно
Я также пытался внедрить службы IServiceProvider в свой обработчик, но безуспешно.
например,
Код: Выделить всё
public Handler(IServiceProvider services)
{
_services = services ?? throw new ArgumentNullException(nameof(services));
}
public async Task CreateResponseAsync(Request request)
{
using var scope = _services.CreateScope();
var crudService = scope.ServiceProvider.GetRequiredService
Подробнее здесь: [url]https://stackoverflow.com/questions/79019354/a-second-operation-was-started-on-this-context-instance-before-a-previous-operat[/url]