Каков наилучший способ проверки на основе сущностей (каждый класс сущностей имеет метод IsValid()
, который проверяет своих внутренних членов) в ASP.NET MVC с моделью «сеанс на запрос», где контроллер имеет нулевое (или ограниченное) знание ISession ? Вот образец, который я использую:
Получить сущность по ID, используя IFooRepository
, который оборачивает текущий сеанс NH. Возвращает экземпляр подключенной сущности.
Загрузка объекта с потенциально недействительными данными, поступающими из сообщения формы.
Подтвердите сущность, вызвав ее IsValid()
метод.
Если действительно, звоните IFooRepository.Save(entity)
, который делегирует ISession.Save()
. В противном случае выведите сообщение об ошибке.
Сессия в настоящее время открывается, когда начинается запрос, и сбрасывается, когда запрос заканчивается . Поскольку моя сущность подключена к сеансу, очистка сеанса пытается сохранить изменения , даже если объект недействителен .
Каков наилучший способ сохранить логику проверки в классе сущности, ограничить знания контроллера NH и избежать сохранения недопустимых изменений в конце запроса?
Вариант 1: явное исключение при сбое проверки, неявное сбрасывание : в случае сбоя проверки я могу вручную удалить недействительный объект в методе действия. В случае успеха я ничего не делаю и сеанс автоматически сбрасывается.
Con : подвержен ошибкам и нелогичен ( "Я не вызывал .Save (), почему все равно мои неверные изменения сохраняются?" )
Вариант 2. Явно сбрасывать, по умолчанию ничего не делать : По умолчанию я могу избавиться от сеанса по окончании запроса, только сбрасывая, если контроллер указывает на успех. Вероятно, я бы создал метод SaveChanges()
в моем базовом контроллере, который устанавливает флаг, указывающий на успех, а затем запросил бы этот флаг при закрытии сеанса в конце запроса.
Pro : более интуитивно понятный способ устранения неполадок, если dev забывает этот шаг [относительно опции 1]
Con : мне нужно позвонить IRepository.Save(entity)
' и SaveChanges()
.
Вариант 3: Всегда работать с отключенными объектами: Я мог бы изменить свои репозитории, чтобы они возвращали отключенные / временные объекты, и изменить метод Repo.Save()
для их повторного присоединения.
Pro : Наиболее интуитивно понятный, учитывая, что контроллеры не знают о NH.
Con : Это наносит ущерб многим из преимуществ, которые я получу от NH?