Я использую ASP.NET Core и EF Core, у которых есть SaveChanges и SaveChangesAsync.
Перед сохранением в базе данных, в моем DbContext, я выполняю некоторые проверки/протоколирование:
public async Task LogAndAuditAsync() {
// do async stuff
}
public override int SaveChanges {
/*await*/ LogAndAuditAsync(); // what do I do here???
return base.SaveChanges();
}
public override async Task<int> SaveChangesAsync {
await LogAndAuditAsync();
return await base.SaveChanges();
}
Проблема заключается в синхронном SaveChanges().
Я всегда делаю "асинхронный путь вниз", но здесь это невозможно. Я мог бы перепроектировать, чтобы иметь LogAndAudit() и LogAndAuditAsync(), но это не СУХОЙ, и мне нужно будет изменить дюжину других основных фрагментов кода, которые не принадлежат мне.
Есть много других вопросов по этой теме, и все они являются общими, сложными и полными дебатов. Мне нужно знать самый безопасный подход в этом конкретном случае.
Итак, в SaveChanges(), как мне безопасно и синхронно вызывать метод async без взаимоблокировок?