Подтвердить что ты не робот

Просмотр проверки модели по сравнению с проверкой модели домена

Если client validation выполняется, когда необходимо сделать domain level validation?

Я использую ASP.NET MVC для своих веб-приложений. Мне нравится различать мои domain models и view models. Мое модели домена содержат данные, которые поступают из моей базы данных, а мои модели просмотра содержат данные о моих представлениях/страницах.

Предположим, что я работаю с данными о клиентах.

У меня будет таблица в моей базе данных под названием Customers.

У меня будет класс клиентов, который может выглядеть примерно так:

public class Customer
{
     public int Id { get; set; }

     public string FirstName { get; set; }

     public string LastName { get; set; }

     public DateTime DateOfBirth { get; set; }
}

И я создам модель представления клиента для представления только данных, которые у меня есть на моем представлении:

[Validator(typeof(CustomerCreateViewModelValidator))]
public class CustomerCreateViewModel
{
     public string FirstName { get; set; }

     public string LastName { get; set; }

     public DateTime DateOfBirth { get; set; }
}

У меня будет представление create, которое принимает мой CustomerCreateViewModel и связывает мои поля ввода с моей моделью просмотра:

@model MyProject.ViewModels.Customers.CustomerCreateViewModel

@using (Html.BeginForm())
{
     <table>
          <tr>
               <td>
                    @Html.TextBoxFor(x => x.FirstName)
                    @Html.ValidationMessageFor(x => x.FirstName)
               </td>
          </tr>
          <tr>
               <td>
                    @Html.TextBoxFor(x => x.LastName)
                    @Html.ValidationMessageFor(x => x.LastName)
               </td>
          </tr>
     </table>

     <button id="SaveButton" type="submit">Save</button>
}

Как вы можете видеть, у меня есть CustomerCreateViewModelValidator, который содержит мои правила проверки. После того, как пользователь ввел некоторые данные в текстовые поля, он нажмет кнопку отправки. Если некоторые из полей пустые, проверка не выполняется. Если все необходимые поля введены, то проверка завершается успешно. Затем я буду сопоставлять данные из модели моего представления с моей моделью домена следующим образом:

Customer customer = Mapper.Map<Customer>(viewModel);

Эта модель домена клиента я беру и передаю ее на мой уровень репозитория, и она добавляет данные в мою таблицу.

Когда нужно выполнить проверку на модели домена? Я выполняю всю мою проверку на моей модели представления. Я могу проверить свои данные в моей модели домена непосредственно перед тем, как добавить его в базу данных, но, увидев, что он был проверен на модели представления, не будет ли это просто повторением той же проверки на стороне клиента?

Неужели кто-то может поделиться некоторыми соображениями по этому вопросу?

4b9b3361

Ответ 1

Всегда проверяйте на обоих уровнях.

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

Но вы также захотите проверить, что все счастливое в домене, как только модель просмотра была проверена. Для простых моделей эти проверки могут быть одинаковыми, и поэтому они выглядят как дублирующая логика, однако, как только ваше приложение растет, поэтому у вас может быть несколько пользовательских интерфейсов или много разных приложений, использующих одни и те же модели домена, становится настолько важным, чтобы проверьте внутри домена.

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

Цели двух уровней проверки также различны. Я ожидал бы, что проверка модели представления сообщит мне о проблемах all (таких как пропущенное имя, фамилия слишком длинная, DoB не является датой). Однако, я думаю, было бы нормально, если логика домена завершится с ошибкой при первой ошибке и просто сообщит об этом. Опять же, для простых моделей может быть возможно собрать все ошибки и сообщить о них все обратно, однако чем сложнее приложение, тем сложнее будет ожидать все ошибки, особенно если логика изменится в зависимости от данных. Но, до тех пор, пока не пройдут только хорошие данные, это должно быть хорошо!

Ответ 2

Как правило, я рассматриваю модель домена как наиболее важный код и, следовательно, управление своим святым государством. По этой причине я бы никогда не предполагал, что модель домена находится в правильном состоянии только потому, что она была оперирована уровнем представления, который должен обеспечивать соблюдение действительности. Это будет означать, что ваш уровень домена тесно связан с вашим уровнем представления.

Лучше всего начать думать о модели домена наружу (луковая архитектура). Обоснование всего этого заключается в том, что модель домена наименее вероятна со временем меняться и действует как ядро ​​приложения, изолируя слои от недостатков друг друга.

Итак, начиная с модели домена, которая обеспечивает свою собственную достоверность, вы остаетесь с вопросом о дублировании кода проверки. Существует много умных способов избежать этого. Например, ваша модель просмотра может попытаться создать объект домена и перевести любые исключения, вызванные ошибками проверки. Валидаторы также могут быть извлечены и повторно использованы. Существует много решений. В зависимости от ваших случаев использования вы должны увидеть, что лучше для вас. Просто будьте осторожны, чтобы все было просто. Возможно, если ваши прецеденты не совпадают, скорее всего, это будет наиболее удобной для дублирования проверки. Помните, что дедупликация увеличивает сложность.

Ответ 3

Я склонен думать о проверке клиента как более дезинфицирующем данные на уровне пользовательского интерфейса. Другими словами, проверка того, что, например, поле ввода, которое является числом, получает номер пользователем. Или длина входного текста соответствует требованиям минимальной длины. Такие вещи.

На уровне домена вам необходимо проверить правила бизнес-домена. Например, если пользователь вводит данные о новом продукте, существует ли название продукта? Или, может быть, проверка того, что пользователь выбрал действительный Департамент при настройке нового пользователя на основе этих навыков пользователя? Это просто из эфира, но я надеюсь, что они дадут представление о том, что я имею в виду.

Ответ 4

Вам понадобится модель валидатора, если у вас несколько клиентов для вашей модели. Например, если у вас есть ASP.NET MVC, вызывающий вашу модель и приложение WPF, в этом случае имеет смысл иметь логику проверки модели. Но в вашем случае, когда у вас есть только один клиент, который будет переполнен.