в чем разница между моделью и объектом передачи данных?

я основываю этот вопрос на Фаулере PoEAA. Учитывая ваше знакомство с этим текстом, разве ViewModels не используются в ASP.NET MVC то же самое, что DTOs? Почему или почему нет? Спасибо.

4 ответов


они служат аналогичной цели (инкапсулирование данных для другого уровня приложения), но они делают это по-разному и по разным причинам.

  • цель DTO-уменьшить количество вызовов между уровнями приложения, особенно когда эти вызовы являются дорогостоящими (например, распределенные системы). DTOs почти всегда тривиально сериализуемы и почти никогда не содержат никакого поведения.

    например, вы разрабатываете сайт электронной коммерции. CreateCustomer и AddCustomerAddress являются отдельными операциями на уровне базы данных, но вы можете по соображениям производительности захотеть объединить их данные в NewCustomerWithAddressDto Так что вашему клиенту нужно только сделать одну поездку туда и обратно на сервер, и не нужно заботиться о том, что сервер может делать кучу разных вещей с пакетом данных.

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

    например, в том же приложении электронной коммерции, ваш CustomerModel неправильная " форма "для представления на вашем представлении" нового клиента". Для во-первых, в вашем представлении есть два поля формы для ввода и подтверждения пароля пользователем, а также CustomerModel не содержит поле пароля вообще! Ваш NewCustomerViewModel будет содержать эти поля и может, в зависимости от вашего вкуса MV*, отвечать за некоторую логику представления (например, для отображения/скрытия частей представления) и базовую проверку (например, обеспечение соответствия обоих полей пароля).


цель другая:

  • DTO используются для передачи данных
  • ViewModels используются для отображения данных конечному пользователю.

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


DTOs в MVVM и MVP обычно Очень Тупые Объекты и в основном просто куча сеттеров свойств и геттеров. ViewModels, с другой стороны, может иметь некоторое поведение.

практический положительный побочный эффект наличия DTOs позволяет упростить сериализацию. Если у вас есть довольно сложный объект, скажем, C#, вам часто придется выборочно отключать вещи, которые вы не хотите сериализовать. Это может стать довольно уродливым и DTOs упростить это процесс.


модель представления и объект передачи данных имеют сходства и различия.

похожие: Передача данных в записи (экземпляр объекта, возможно, сериализованный) в приемник, будь то представление или служба

разница: Модель представления предназначена для отправки в представление, где она будет отображаться, с форматированием. Модель представления также отправляет данные контроллеру. DTO обычно не предназначен для презентации. Он предназначен для отправки необработанных данных.