Ответ 1
Они выполняют аналогичную задачу (инкапсулирование данных для другого уровня приложения), но они делают это по-разному и по разным причинам.
-
Цель DTO - уменьшить количество вызовов между уровнями приложения, особенно когда эти вызовы дороги (например, распределенные системы). DTO почти всегда тривиально сериализуемы и почти никогда не содержат никакого поведения.
Например, вы разрабатываете сайт электронной коммерции.
CreateCustomer
иAddCustomerAddress
являются отдельными операциями на уровне базы данных, но вы можете по соображениям производительности захотите объединить свои данные вNewCustomerWithAddressDto
, чтобы ваш клиент только должен был совершить один рейс туда-обратно на сервер, t нужно заботиться о том, чтобы сервер мог делать кучу разных вещей с пакетом данных. -
Термин "ViewModel" означает несколько разные вещи в разных вкусах MV *, но его цель в основном заключается в разделении проблем. Ваша модель часто оптимизирована для какой-либо цели, отличной от презентации, и ответственность ViewModel заключается в том, чтобы отделить ваш вид от деталей реализации модели. Кроме того, большинство шаблонов MV * советуют сделать ваши представления "как можно глубже", и поэтому ViewModel иногда берет на себя ответственность за логику представления.
Например, в том же приложении электронной коммерции ваш
CustomerModel
является неправильной формой для презентации в представлении "Новый клиент". Во-первых, у вашего представления есть два поля формы, чтобы ваш пользователь мог ввести и подтвердить свой пароль, а вашCustomerModel
не содержит поля пароля вообще! ВашNewCustomerViewModel
будет содержать эти поля и может, в зависимости от вашего вкуса MV *, отвечать за какую-либо логику представления (например, показать/скрыть части представления) и базовую проверку (например, убедиться, что оба поля пароля совпадают).