TL; DR:
DTO описывает схему передачи государства. POCO ничего не описывает. Это еще один способ сказать «объект» в ООП. Это происходит от POJO (Java), придуманного Мартином Фаулером, который буквально описывает его как причудливое имя для «объекта», потому что «объект» не очень сексуален.
DTO - это объектный паттерн, используемый для передачи состояния между интересующими слоями. Они могут иметь поведение (то есть технически может быть poco), пока это поведение не изменяет состояние. Например, у него может быть метод, который сериализует себя.
POCO - это простой объект, но под «простым» подразумевается то, что он не является особенным. Это просто означает, что это объект CLR без какого-либо подразумеваемого шаблона. Общий термин. Он не предназначен для работы с другими фреймворками. Так что, если ваш POCO имеет [JsonProperty]
или EF украшения во всех своих свойствах, например, то я бы сказал, что это не POCO.
Вот несколько примеров различных типов объектов для сравнения:
- Модель представления : используется для моделирования данных для представления. Обычно имеет аннотации данных для облегчения привязки и проверки. В MVVM он также действует как контроллер. Это больше, чем DTO
- Value Object : используется для представления значений
- Aggregate Root : используется для управления состоянием и инвариантами
- Обработчики : используются для ответа на событие / сообщение
- Атрибуты : используется в качестве украшения для решения сквозных проблем
- Сервис : используется для выполнения сложных задач
- Контроллер : используется для управления потоком запросов и ответов
- Фабрика : используется для настройки и / или сборки сложных объектов для использования, когда конструктор недостаточно хорош. Также используется для принятия решения о том, какие объекты должны быть созданы во время выполнения.
- Репозиторий / DAO : используется для доступа к данным
Все это просто объекты, но обратите внимание, что большинство из них, как правило, привязаны к шаблону. Таким образом, вы могли бы назвать их «объектами» или вы могли бы быть более точными в отношении его намерений и называть его так, как оно есть. Это также, почему у нас есть шаблоны проектирования; описать сложные концепции в нескольких работах. DTO это шаблон. Агрегированный корень - это шаблон, View Model - шаблон (например, MVC и MVVM). POCO это не шаблон.
POCO не описывает шаблон. Это просто другой способ ссылки на классы / объекты в ООП. Думайте об этом как об абстрактном понятии; они могут относиться к чему угодно. ИМО, хотя есть односторонние отношения, потому что, как только объект достигает точки, когда он может чисто служить только одной цели, он больше не является POCO. Например, как только вы пометите свой класс украшениями, чтобы он работал с какой-то структурой, он больше не будет POCO. Следовательно:
- DTO - это POCO
- POCO - это не DTO
- Модель представления - это POCO
- POCO - это не модель представления
Смысл разграничения между ними заключается в том, чтобы сохранить четкость и последовательность шаблонов, чтобы не допустить пересечения проблем и привести к тесной взаимосвязи. Например, если у вас есть бизнес-объект, который имеет методы для изменения состояния, но он также украшен украшениями EF для сохранения в SQL Server и JsonProperty, чтобы его можно было отправить обратно через конечную точку API. Этот объект будет нетерпим к изменению и, скорее всего, будет завален вариантами свойств (например, UserId, UserPk, UserKey, UserGuid, где некоторые из них помечены так, что они не сохранены в БД, а другие помечены как не сериализованные для JSON в конечной точке API).
Так что, если бы вы сказали мне, что что-то было DTO, то я бы, наверное, позаботился о том, чтобы оно никогда не использовалось ни для чего, кроме перемещения состояния вокруг. Если бы вы сказали мне, что что-то было моделью представления, то я, вероятно, удостоверился бы, что это не было сохранено в базе данных. Если бы вы сказали мне, что что-то было моделью предметной области, то я, вероятно, удостоверился бы, что она не зависит ни от чего вне домена. Но если бы вы сказали мне, что что-то было POCO, вы бы вообще ничего мне не рассказывали.