В чем разница между моделью представления и объектом передачи данных? - PullRequest
46 голосов
/ 16 сентября 2009

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

Ответы [ 4 ]

81 голосов
/ 16 сентября 2009

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

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

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

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

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

15 голосов
/ 16 сентября 2009

DTO в MVVM и MVP обычно Очень тупые объекты и, по сути, являются просто набором установщиков и получателей свойств. С другой стороны, ViewModels может иметь некоторое поведение.

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

15 голосов
/ 16 сентября 2009

Цель другая:

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

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

1 голос
/ 24 января 2013

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

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

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

...