MiniBegemot
@MiniBegemot

Трехуровневая архитектура ASP.NET MVC. Где проводить валидацию данных?

Суть заключается в следующем, мне необходимо в проекте реализовать трехуровневую архитектуру и в качестве уровня представления должен выступать ASP.NET MVC, у меня встал вопрос где должны валидироваться данные, в классическом MVC валидация происходит в самом контроллере, например задаем моделям ограничения с использование DataAnnotations а в контроллере просто проверяем ModelState и в случае ошибки выводит это в представление.
Но в случае трехуровневой архитектуры валидация как я понимаю должна происходить на уровне логики (BLL), т.е. контроллер должен передать данные на уровень BLL, затем они там валидируются и в случае ошибки BLL должен вернуть какое-то сообщение контроллеру, чтобы он вывел это в представление.

Как вариант можно делать двойную проверку, т.е. на уровне UI (в MVC проекте) и в BLL, тогда мы избавимся от проблемы того, как правильно отобразить пользователю сообщение об ошибке, но придется дублировать проверки т.к. на уровне BLL обязательно должны валидировать данные.

Может кто-то объяснить как это правильнее реализовать, и желательно привести любой пример.
  • Вопрос задан
  • 1447 просмотров
Решения вопроса 1
petermzg
@petermzg
Самый лучший программист
На уровне BLL вы валидируете вхождение значений в установленные границы и корректность значений,
а на уровне MVC наличие и соответствие типов.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Проверять можно на всех уровнях.
1) Контроллеры MVC - FluentValidation
2) Далее все через контракты.
Через IoC обертываем все в интерфейсы, и далее:
[ContractClass(typeof(IArrayContract))]
public interface IArray
{ контракт }

[ContractClassFor(typeof(IArray))]
internal abstract class IArrayContract : IArray
{ проверка входных и выходных параметров контрактов }


+ проверки на интерфейсах можно включать и выключать на вкладке свойств проекта, 4 уровня проверки.
+ проверки внедряются во все типы реализующие контракт.
- нельзя просто так взять и перехватить тип исключения от контракта, придется ловить все.

Из BBL не выкинишь HTTP ошибку, придется либо делать фильтр, либо ловить их в каждом методе и через switch кидать, но это не очень.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы