Простой старый объект CLR против объекта передачи данных



POCO = обычный старый CLR (или лучше: класс) объект



DTO = объект передачи данных



в этой post есть разница, но, честно говоря, большинство блогов, которые я читаю, описывают POCO так, как определяется DTO: DTOs-это простые контейнеры данных, используемые для перемещения данных между слоями приложения.



POCO и DTO - это одно и то же?

623   9  

9 ответов:

POCO следует правилам ООП. Он должен (но не должен) иметь состояние и поведение. POCO происходит от POJO, придуманного Мартином Фаулером [вот анекдот]. Он использовал термин POJO как способ сделать его более сексуальным, чтобы отказаться от реализации фреймворка heavy EJB. POCO должен использоваться в том же контексте в .Net. не позволяйте фреймворкам диктовать дизайн вашего объекта.

единственной целью DTO является передача состояния и не должно иметь поведения. Видеть Мартин Фаулер объяснение DTO для примера использования этого шаблона.

вот в чем разница: POCO описывает подход к программированию (старое доброе объектно-ориентированное программирование), где DTO-это шаблон который используется для" передачи данных " с помощью объектов.

в то время как вы можете рассматривать POCOs как DTOs, вы рискуете создать анемичной домена модель если вы это сделаете. Кроме того, есть несоответствие в структуре, поскольку DTO должны быть предназначены для передачи данных, а не для представления истинной структуры бизнес-домена. Результатом этого является то, что DTO, как правило, более плоские, чем ваш фактический домен.

в домене любой разумной сложности вам почти всегда лучше создавать отдельные доменные POCOs и переводить их в DTOs. DDD (domain driven design) определяет антикоррупционный слой (еще одна ссылка здесь, но лучше всего сделать это купить книгу), что является хорошей структурой, которая делает сегрегацию ясной.

Это, вероятно, излишне для меня, чтобы внести свой вклад, так как я уже изложил свою позицию в своей статье в блоге, но последний абзац этой статьи Как бы подводит итог:

Итак, в заключение, научитесь любить POCO и убедитесь, что вы не распространяете дезинформацию о том, что это то же самое, что и DTO. DTOs-это простые контейнеры данных, используемые для перемещения данных между слоями приложения. POCOs - это полноценные бизнес-объекты с одним требованием: они не знают настойчивости (нет методов get или save). Наконец, если вы еще не проверили книгу Джимми Нильссона, возьмите ее из своих местных университетских стеков. У него есть примеры в C#, и это отличное чтение.

кстати, Патрик я читал POCO как статью о стиле жизни, и я полностью согласен, что это фантастическая статья. Это на самом деле раздел из книги Джимми Нильссона, которую я рекомендовал. Я понятия не имел, что он был доступен онлайн. Его книга действительно является лучшим источником информация, которую я нашел в POCO / DTO / Repository / и других методах разработки DDD.

POCO-это просто объект, который не зависит от внешней среды. Это ясно.

имеет ли POCO поведение или нет, не имеет значения.

A DTO может быть POCO как объект домена (который обычно будет богат поведением)

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

в типичном Луке архитектуры стилей (часто используемые в рамках широкого подхода DDD) доменный слой размещается в центре, и поэтому его объекты не должны в этот момент иметь зависимости за пределами этого слоя.

Я написал статью на эту тему: DTO vs Value Object vs POCO.

короче:

  • DTO != Значение Объекта
  • DTO ⊂ POCO
  • значение объекта ⊂ POCO

Я думаю, что DTO может быть POCO. DTO-это больше об использовании объекта, в то время как POCO-это больше стиль объекта (отделенный от архитектурных концепций).

один пример, где POCO-это что-то другое, чем DTO, когда вы говорите о POCO внутри вашей модели домена/модели бизнес-логики, которая является хорошим представлением OO вашего проблемного домена. Вы можете использовать POCO на протяжении всего приложения, но это может иметь некоторые нежелательные побочные эффекты, такие как утечка знаний. DTO, например, используются из уровня сервиса, с которым взаимодействует пользовательский интерфейс, DTO-это плоское представление данных и используются только для предоставления пользовательского интерфейса с данными и передачи изменений обратно на уровень сервиса. Уровень сервиса отвечает за сопоставление DTO в обоих направлениях с объектами домена POCO.

обновление Мартин Фаулер сказал что этот подход-тяжелый путь, и его следует принимать только в том случае, если есть значительное несоответствие между уровнем домена и пользовательским интерфейсом.

вот общее правило: DTO==зло и индикатор чрезмерно разработанного программного обеспечения. POCO= = хорошо. "корпоративные" модели разрушили мозг многих людей в мире Java EE. пожалуйста, не повторяйте ошибку в .NET land.

основной вариант использования для DTO заключается в возврате данных из веб-службы. В этом случае POCO и DTO эквивалентны. Любое поведение в POCO будет удалено, когда оно будет возвращено из веб-службы, поэтому на самом деле не имеет значения, имеет ли оно поведение.

классы DTO используются для сериализации / десериализации данных из разных источников. Когда вы хотите десериализовать объект из источника, не имеет значения, какой это внешний источник: сервис, файл, база данных и т. д. возможно, вы хотите использовать только часть этого, но вам нужен простой способ десериализации этих данных в объект. после этого вы копируете эти данные в XModel вы хотите использовать. Сериализатор-это красивая технология для загрузки объектов DTO. Зачем? вам нужна только одна функция для загрузки (десериализация) объект.

даже не называйте их DTO. Они называются модели....Период. Модели никогда не имеют поведения. Я не знаю, кто придумал этот глупый термин DTO, но это должно быть .NET-это все, что я могу понять. Подумайте о моделях просмотра в MVC, той же самой вещи dam**, модели используются для передачи состояния между слоями на стороне сервера или в течение периода провода, все они являются моделями. Свойства с данными. Это модели, которые вы передаете Ove провод. Модели, Модели, Модели. Вот и все.

желаю глупый термин DTO исчез бы из нашего словаря.

Comments

    Ничего не найдено.