У меня есть специальное промежуточное ПО, цель которого - подписаться на события Eb Core dbcontext и отслеживать изменения, которые происходят с объектами.Промежуточное программное обеспечение создает экземпляр InteractionService в качестве экземпляра с областью действия в начале каждого запроса.Вот так выглядит мое промежуточное ПО:
public static IApplicationBuilder UseDbContextActivityTracker<TContext>(this IApplicationBuilder app)
where TContext : DbContext
{
app.Use(async (context, next) =>
{
var service = context.RequestServices.GetRequiredService<InteractionService<TContext>>();
await next.Invoke();
service.PersistLogs();
});
return app;
}
, и вот как я использую промежуточное ПО в своем методе Confiure класса Startup:
options.UseDbContextActivityTracker<ApplicationDbContext>();
В конструкторе моего InteractionService Iполучить ссылку на dbcontext через DI, и я подписываюсь на события:
public InteractionService(TContext context)
{
this.context = context;
this.context.ChangeTracker.StateChanged += ChangeTracker_StateChanged;
}
Во время прослушивания событий, которые происходят с dbContext во время запроса, я сохраняю соответствующую информацию в своих собственных объектахи это прекрасно работает.Однако в конце запроса я хочу сохранить изменения в базе данных.Я попытался сделать свой класс InteractionService IDisposable и в методе Dispose я вызываю другой DbContext, в котором я сохраняю свои сущности.Как и ожидалось, я получил ошибку «Соединение уже закрыто». Каково правильное место для сохранения моих сущностей в БД после завершения запроса?