Объект передачи данных - это всего лишь подмножество или надмножество данных, подлежащих передаче между логическими и физическими границами. Они не могут обеспечить поведение . Это всего лишь данные.
На противоположной стороне модель представления представляет собой сочетание данных и поведения, поскольку они являются логической стороной данного вида.
Поскольку DTO и VM - это шаблоны, которые охватывают различные варианты использования, вы можете в итоге бесполезно использовать данные и поведение, и вы можете добавлять нежелательные зависимости.
Например, DTO может использоваться как в доменах, так и в приложениях. Если вы используете обе концепции DTO и VM, реализованные в одном классе, вы можете заставить проект домена добавить ссылку на библиотеку пользовательского интерфейса, чтобы иметь возможность ее создавать. Я бы избегал этого как можно больше.
Кроме того, вы знаете, есть объектно-ориентированная концепция называется наследование, который может помочь вам здесь, чтобы остаться DRY (не повторяй себя):
public class Base {}
public class Dto : Base {}
public class ViewModel : Base {}
Таким образом, вы можете делиться тем, что является общим для обоих DTO, и просматривать модели с наследованием и избегать повторения кода.
Как насчет 'DTO' ** как ** базового класса? Простое литье VM в базовый класс производит DTO (нет необходимости копировать что-либо). – Sinatr
@Sinatr Так как я ортодокс, я бы не хотел делать следующее утверждение правдой: 'if (vm is Dto)': \ –