Я основываю этот вопрос на Fowler PoEAA. Учитывая ваше знакомство с этим текстом, не являются ли ViewModels, используемые в ASP.NET MVC, такими же, как DTO? Почему или почему нет? Спасибо.
В чем разница между моделью просмотра и объектом передачи данных?
Ответ 1
Они выполняют аналогичную задачу (инкапсулирование данных для другого уровня приложения), но они делают это по-разному и по разным причинам.
-
Цель DTO - уменьшить количество вызовов между уровнями приложения, особенно когда эти вызовы дороги (например, распределенные системы). DTO почти всегда тривиально сериализуемы и почти никогда не содержат никакого поведения.
Например, вы разрабатываете сайт электронной коммерции.
CreateCustomer
иAddCustomerAddress
являются отдельными операциями на уровне базы данных, но вы можете по соображениям производительности захотите объединить свои данные вNewCustomerWithAddressDto
, чтобы ваш клиент только должен был совершить один рейс туда-обратно на сервер, t нужно заботиться о том, чтобы сервер мог делать кучу разных вещей с пакетом данных. -
Термин "ViewModel" означает несколько разные вещи в разных вкусах MV *, но его цель в основном заключается в разделении проблем. Ваша модель часто оптимизирована для какой-либо цели, отличной от презентации, и ответственность ViewModel заключается в том, чтобы отделить ваш вид от деталей реализации модели. Кроме того, большинство шаблонов MV * советуют сделать ваши представления "как можно глубже", и поэтому ViewModel иногда берет на себя ответственность за логику представления.
Например, в том же приложении электронной коммерции ваш
CustomerModel
является неправильной формой для презентации в представлении "Новый клиент". Во-первых, у вашего представления есть два поля формы, чтобы ваш пользователь мог ввести и подтвердить свой пароль, а вашCustomerModel
не содержит поля пароля вообще! ВашNewCustomerViewModel
будет содержать эти поля и может, в зависимости от вашего вкуса MV *, отвечать за какую-либо логику представления (например, показать/скрыть части представления) и базовую проверку (например, убедиться, что оба поля пароля совпадают).
Ответ 2
Цель другая:
- DTO используются для передачи данных
- ViewModels используются для отображения данных конечному пользователю.
Таким образом, обычно ViewModels содержат данные презентации, ведь во многих случаях это похоже на то, что находится в DTO, но с некоторыми отличиями. Подумайте о представлении перечислений, локализации, валюте, форматах даты,.... Это связано с тем, что в вашем представлении не должно быть никакой логики.
Ответ 3
DTO в MVVM и MVP обычно Очень тупые объекты и представляют собой в основном просто набор свойств и геттеров. ViewModels, с другой стороны, могут иметь какое-то поведение.
Практический положительный побочный эффект использования DTO позволяет упростить сериализацию. Если у вас есть довольно сложный объект, скажем, С#, вы часто будете вынуждены избирательно отключать все, что вам не нужно сериализовать. Это может стать довольно уродливым, и DTO упрощают этот процесс.
Ответ 4
Модель просмотра и объект передачи данных имеют сходства и различия.
Похожие: Перенос данных в запись (экземпляр объекта, возможно, сериализованный) в приемник, будь то просмотр или служба
Разница: Модель просмотра предназначена для отправки в представление, где оно будет отображаться, с форматированием. Модель просмотра также отправляет данные обратно контроллеру. DTO обычно не предназначен для представления. Он предназначен для отправки необработанных данных.