Вот как я это сделал.
Пусть ваш уровень обслуживания выдает исключения при сбое бизнес-правила / правила проверки.Создайте для этого собственное Исключение проверки и включите в него некоторые свойства для хранения сведений об ошибке проверки - (например, какое свойство имеет ошибку проверки и каково сообщение)
Затем создайте метод расширения для Исключения, который будетскопируйте детали ошибки в ModelState (я получил эту идею от Стив Сандерсонса, довольно превосходная книга «Pro Asp.Net MVC 2 Framework») - если вы все сделаете правильно, MVC выделит недопустимые поля, покажет ошибки в пользовательском интерфейсе и т. д.
Тогда ваш контроллер будет содержать что-то вроде этого
try
{
Service.DoSomeThing();
}
catch (Exception err)
{
err.CopyTo(ModelState);
}
Это означает, что ваши бизнес-правила и проверка теперь находятся на вашем уровне обслуживания, и это может быть использовано повторно.
Рассмотрите также передачу DTO / моделей представлений в ваши представления и сопоставление ваших доменных объектов с DTO и (и наоборот) вместо передачи ваших доменных объектов вашим представлениям.
Тогда модели DTO / представления могутнаходиться в слое MVC, и вы можете украсить их с помощью атрибутов проверки и иметьntroller передает их представлениям - таким образом, используя встроенную проверку MVC.
Вы обнаружите, что для любого сложного проекта проверка, требуемая на пользовательском интерфейсе, может немного отличаться от требуемой в бизнес-правилах.конец, так что это помогает отделить это.
Существует хорошая библиотека под названием AutoMapper , которая позволяет легко сопоставлять объекты вашего домена с вашими DTO (и наоборот) без большого количества шаблонов.код.