У нас есть REST API с .NET 7 , EFCore, SQL Server и мультиарендный подход. У нас есть новое требование: после сохранения объектов в DBContext арендатора нам необходимо выполнить их постобработку. Все они. Я знаю, что это необходимо сделать после завершения работы SaveChanges и что мы могли бы просто ставить объект в очередь каждый раз, когда у нас есть вызов saveChanges на уровне сервиса, но, к сожалению, у нас есть устаревший код, и во многих местах для этого потребуется активировать постановку в очередь. Мы хотим сделать это централизованно, поэтому мы подумали об использовании трех разных подходов:
- Переопределение метода SaveChanges в DBContext
- Событие SavingChanges/SaveChanges
- Перехватчик SavingChanges/SaveChanges
Все три решения в основном одинаковы: перед SaveChanges мы получаем созданные/измененные объекты, а после выполнения SaveChanges мы помещаем их в очередь. С переопределением SaveChanges это довольно просто: мы получаем измененные объекты и ставим в очередь после выполнения SaveChanges, но с перехватчиками/событиями это сложно, потому что нет линейного выполнения, у нас есть два разных триггера (SavingChanges и SavedChanges). В одном есть DbContext со всеми отслеживаемыми изменениями, а в другом — новое состояние DBContext после сохранения изменений: отслеживаемых изменений нет. Итак, мой вопрос:
Как мы можем организовать перехватчик/события SavingChanges и SaveChanges, чтобы отслеживать изменения и иметь возможность ставить элементы в очередь после того, как изменения были наверняка сохранены? Работают ли перехватчики как-то как одиночки, и поэтому отслеживание измененных объектов требует дополнительной работы, или они создаются как Transient/Scoped, и в каждом запросе легко отслеживать изменения?
Подробнее здесь: https://stackoverflow.com/questions/756 ... nt-to-keep