Я сам боролся с этим. Есть случаи, когда DTO имеет смысл использовать в презентации. Допустим, я хочу показать раскрывающийся список компаний в своей системе, и мне нужен их идентификатор, чтобы привязать значение.
Что ж, вместо загрузки объекта CompanyObject, который может иметь ссылки на подписки или кто знает что еще, я мог бы отправить обратно DTO с именем и идентификатором. ИМХО, это хорошее применение.
А теперь возьмем другой пример. У меня есть объект, который представляет собой оценку, эта оценка может состоять из рабочей силы, оборудования и т. Д., Она может содержать множество вычислений, определенных пользователем, которые берут все эти элементы и суммируют их (каждая оценка может отличаться для разных типов расчетов). Почему мне нужно дважды моделировать этот объект? Почему я не могу просто заставить свой пользовательский интерфейс перечислять вычисления и отображать их?
Обычно я не использую DTO для изоляции слоя домена от пользовательского интерфейса. Я использую их, чтобы изолировать слой домена от границы, находящейся вне моего контроля. Идея о том, что кто-то поместит навигационную информацию в свой бизнес-объект, нелепа, не загрязняйте свой бизнес-объект.
Идея, что кто-то поместит валидацию в свой бизнес-объект? Что ж, я говорю, что это хорошо. Ваш пользовательский интерфейс не должен нести исключительную ответственность за проверку ваших бизнес-объектов. Ваш бизнес-уровень ДОЛЖЕН проводить собственную проверку.
Зачем помещать код генерации пользовательского интерфейса в бизнес-объект? В моем случае у меня есть отдельные объекты, которые генерируют код пользовательского интерфейса отдельно от пользовательского интерфейса. У меня есть объекты sperate, которые отображают мои бизнес-объекты в Xml, идея о том, что вы должны разделять свои слои, чтобы предотвратить этот тип загрязнения, мне настолько чужда, потому что зачем вам вообще помещать код генерации HTML в бизнес-объект ...
Изменить.
Я думаю, что есть случаи, когда информация пользовательского интерфейса может принадлежать слою домена. И это может затуманивать то, что вы называете уровнем домена, но я работал над мультитенантным приложением, которое имело совсем другое поведение, как внешний вид пользовательского интерфейса, так и функциональный рабочий процесс. В зависимости от различных факторов. В этом случае у нас была модель предметной области, которая представляла клиентов и их конфигурацию. Их конфигурация включала информацию пользовательского интерфейса (например, метки для общих полей).
Если бы мне пришлось проектировать свои объекты так, чтобы они оставались устойчивыми, должен ли я также дублировать объекты? Имейте в виду, что если вы хотите добавить новое поле, у вас есть два места для его добавления. Возможно, это вызывает другой вопрос, если вы используете DDD, все ли являются объектами домена постоянных сущностей? Я знаю на своем примере, что они были.