Что такое объект передачи данных (DTO)?

Что такое объект передачи данных?

В MVC есть классы моделей DTO, а если нет, то каковы различия и нужны ли нам оба?


person Yaron Naveh    schedule 26.06.2009    source источник


Ответы (11)


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

DTO чаще всего используются уровнем служб в многоуровневом приложении для передачи данных между собой и уровнем пользовательского интерфейса. Основное преимущество здесь заключается в том, что он уменьшает объем данных, которые необходимо пересылать по сети в распределенных приложениях. Они также создают отличные модели в шаблоне MVC.

Другое использование DTO может заключаться в инкапсуляции параметров для вызовов методов. Это может быть полезно, если метод принимает более четырех или пяти параметров.

При использовании шаблона DTO вы также должны использовать ассемблеры DTO. Ассемблеры используются для создания DTO из объектов домена и наоборот.

Преобразование из объекта домена в DTO и обратно может быть дорогостоящим процессом. Если вы не создаете распределенное приложение, вы, вероятно, не увидите больших преимуществ от этого шаблона, поскольку Мартин Фаулер объясняет здесь.

person Benny Hallett    schedule 29.06.2009
comment
DTO создает отличные модели в шаблоне MVC - но разве модель не должна содержать все данные объекта, а DTO следует оптимизировать с помощью части данных? Если у меня есть модель A, и мне нужно передать ее двум подсистемам, будут ли A_DTO_1 и A_DTO_2 с соответствующими полями каждой? DTO могут инкапсулировать параметры для вызовов методов - ›Значит, каждый класс, который обертывает параметры, является DTO, даже если это не распределенная система? Разве модели в MVC не являются объектом предметной области? - person Yaron Naveh; 01.07.2009
comment
Отвечая на ваш первый вопрос, я не думаю, что мы говорили об одном и том же. Модель в MVC не обязательно должна быть классом из вашей модели предметной области. Сказав это, это вполне могло быть. Использование DTO удаляет все ненужное. Просто зависит от архитектуры, которую вы собираетесь использовать. Я не знаю точно, как ответить на ваш второй вопрос. Независимо от того, проходит ли он по сети или нет, это все еще объект, который инкапсулирует кучу данных для передачи между (под) системами, поэтому я бы сказал, что это DTO. - person Benny Hallett; 06.07.2009
comment
Другое использование DTO может заключаться в инкапсуляции параметров для вызовов методов. Это может быть полезно, если метод принимает более 4 или 5 параметров. На самом деле это антипаттерн, называемый классом полтергейста или цыганской повозки. Если вашему методу требуется 4 аргумента, дайте ему 4, не создавайте класс только для того, чтобы переместить объект в метод или класс. - person Wix; 10.12.2010
comment
@Wix, хорошая мысль. Однако я бы сказал, что это нормально, если это семантически правильно (скажем, если вы передадите класс настроек со свойствами, а не сами свойства в качестве значений). Чего вам не следует делать, так это вводить все аргументы ради передачи одного объекта, поскольку они вполне могут быть не связаны между собой и впоследствии вызвать распутывание кошмаров. - person Aram Kocharyan; 21.09.2012
comment
DTO не следует использовать для инкапсуляции параметров для вызовов методов (что сделало бы их LocalDTO), они были введены в контексте удаленных интерфейсов: martinfowler.com/bliki/LocalDTO.html - person Rui; 01.10.2013
comment
@Wix a poltergeist почти противоположен объекту параметра (или DTO). Полтергейст не имеет состояния, в то время как объект параметра или DTO - это не что иное, как состояние. - person jaco0646; 02.03.2020
comment
@Wix, если у вас есть 6+ параметров, чаще всего их есть разумные инкапсуляции, и вы должны их искать. Вроде area(x1, y1, x2, y2, x3, y3, x4, y4). Редко бывает, чтобы у вас было больше полдюжины действительно отдельных аргументов. - person Paul Draper; 23.06.2020
comment
и DTO будет полезен в DDD. с трепетом - person Amit Singh; 31.03.2021

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

person blu    schedule 26.06.2009

DTO - это тупой объект - он просто содержит свойства и имеет геттеры и сеттеры, но не имеет никакой другой логики, имеющей какое-либо значение (кроме, возможно, реализации compare() или equals()).

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

person Eric Petroelje    schedule 26.06.2009
comment
Вы описываете LocalDTO: martinfowler.com/bliki/LocalDTO.html - person Rui; 01.10.2013
comment
Один случай, когда полезно использовать что-то вроде DTO, - это когда у вас есть значительное несоответствие между моделью на уровне представления и базовой моделью предметной области. В этом случае имеет смысл создать фасад / шлюз для конкретной презентации, который отображает модель предметной области и представляет интерфейс, удобный для презентации. - person Amitābha; 14.08.2015

Как правило, объекты-значения должны быть неизменяемыми. Подобно объектам Integer или String в Java. Мы можем использовать их для передачи данных между уровнями программного обеспечения. Если уровни программного обеспечения или службы работают на разных удаленных узлах, например, в среде микросервисов или в устаревшем приложении Java Enterprise. Мы должны сделать почти точные копии двух классов. Здесь мы встретили DTO.

|-----------|                                                   |--------------|
| SERVICE 1 |--> Credentials DTO >--------> Credentials DTO >-- | AUTH SERVICE |
|-----------|                                                   |--------------|

В устаревших Java Enterprise Systems DTO могут содержать различные EJB-компоненты.

Я не знаю, является ли это наилучшей практикой или нет, но я лично использую объекты значений в своих проектах Spring MVC / Boot следующим образом:

        |------------|         |------------------|                             |------------|
-> Form |            | -> Form |                  | -> Entity                   |            |
        | Controller |         | Service / Facade |                             | Repository |
<- View |            | <- View |                  | <- Entity / Projection View |            |
        |------------|         |------------------|                             |------------|

Слой Контроллер не знает, что это за объекты. Он взаимодействует с объектами Форма и Просмотр значений. Объекты формы имеют аннотации проверки JSR 303 (например, @NotNull), а объекты значений представления имеют аннотации Джексона для настраиваемой сериализации. (например, @JsonIgnore)

Уровень сервиса взаимодействует с уровнем репозитория с помощью объектов Entity. На объектах Entity есть аннотации JPA / Hibernate / Spring Data. Каждый уровень взаимодействует только с нижним уровнем. Межуровневая связь запрещена из-за циклической / циклической зависимости.

User Service ----> XX CANNOT CALL XX ----> Order Service

Некоторые структуры ORM имеют возможность проецирования с помощью дополнительных интерфейсов или классов. Таким образом, репозитории могут напрямую возвращать объекты View. Там вам не нужно дополнительных преобразований.

Например, это наша сущность User:

@Entity
public final class User {
    private String id;
    private String firstname;
    private String lastname;
    private String phone;
    private String fax;
    private String address;
    // Accessors ...
}

Но вы должны вернуть список пользователей с разбивкой на страницы, который включает только id, firstname, lastname. Затем вы можете создать объект значения представления для проекции ORM.

public final class UserListItemView {
    private String id;
    private String firstname;
    private String lastname;
    // Accessors ...
}

Вы можете легко получить результат с разбивкой на страницы из уровня репозитория. Благодаря spring вы также можете использовать только интерфейсы для проекций.

List<UserListItemView> find(Pageable pageable);

Не беспокойтесь о других операциях преобразования BeanUtils.copy метод работает нормально.

person Fırat KÜÇÜK    schedule 27.10.2012

  1. Для меня лучший ответ на вопрос что такое DTO состоит в том, что DTO - это простые объекты, которые не должны содержать никакой бизнес-логики или реализации методов, требующих тестирования < / em>.
  2. Обычно ваша модель (с использованием шаблона MVC) представляет собой интеллектуальные модели, и они могут содержать множество / несколько методов, которые выполняют некоторые различные операции специально для этой модели (не бизнес-логика, это должно быть на контроллерах). Однако, когда вы передаете данные (например, вызываете конечную точку REST (_1 _ / _ 2_ / независимо) откуда-то или используете веб-сервис с использованием SOA и т. Д.), Вы не хотите передавать объект большого размера с кодом, который не необходим для конечной точки, будет потреблять данные и замедлять передачу.
person Thiago Burgos    schedule 18.03.2015
comment
Почему бизнес-логика должна быть в контроллерах? - person AlexioVay; 30.01.2020
comment
@ Тиаго Бургос вы имели в виду в службах? - person tdranv; 04.09.2020

С помощью MVC объекты передачи данных часто используются для сопоставления моделей предметной области с более простыми объектами, которые в конечном итоге будут отображаться в представлении.

Из Википедии:

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

person Dan    schedule 26.06.2009
comment
Объект значения не является DTO. - person coderpc; 23.01.2019

Принцип, лежащий в основе объекта передачи данных, заключается в создании новых объектов данных, которые включают только те свойства, которые необходимы для конкретной транзакции данных.

Преимущества включают:

Повышение безопасности передачи данных. Уменьшите размер передаваемых данных, если удалите все ненужные данные.

Подробнее: https://www.codenerd.co.za/what-is-data-transfer-objects

person MrG    schedule 16.02.2021

Все кредиты принадлежат Рику-Андресону

Рабочие приложения обычно ограничивают вводимые и возвращаемые данные с помощью подмножества модели. Для этого есть несколько причин, и безопасность является одной из основных. Подмножество модели обычно называется объектом передачи данных (DTO), моделью ввода или моделью представления.

DTO можно использовать для:

  • Предотвратить чрезмерное количество публикаций.
  • Скрыть свойства, которые клиенты не должны просматривать.
  • Опустите некоторые свойства, чтобы уменьшить размер полезной нагрузки.
  • Сглаживайте графы объектов, содержащие вложенные объекты.
  • Сглаженные графы объектов могут быть более удобными для клиентов.

Практическая реализация подхода DTO, Рик-Андресон в Microsoft Web API лучшие учебные пособия и практики с использованием C # и ASP .Net Core 5:

person Ali.Ghodrat    schedule 19.04.2021

Объект передачи данных (DTO) описывает «объект, который переносит данные между процессами» (Википедия) или «объект, который используется для инкапсуляции данных и отправки их из одной подсистемы приложения в другую» (ответ на переполнение стека).

person mostafa kazemi    schedule 03.03.2020

DefN

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

Напротив, динамическая модель или «мешок свойств» решает проблему моделирования записи данных, когда производственный процесс создается во время выполнения.

Квар

DTO можно смоделировать с помощью полей или свойств, но кто-то изобрел очень полезный контейнер данных, называемый Cvar. Это ссылка на значение. Когда DTO моделируется с помощью того, что я называю ссылочными свойствами, модули могут быть настроены для совместного использования кучи памяти и, таким образом, совместной работы над ней. Это полностью исключает передачу параметров и связь O2O из вашего кода. Другими словами, DTO, имеющие ссылочные свойства, позволяют коду достичь нулевого связывания.

    class Cvar { ... }

    class Cvar<T> : Cvar
    {
        public T Value { get; set; }
    }

    class MyDTO
    {
        public Cvar<int> X { get; set; }
        public Cvar<int> Y { get; set; }
        public Cvar<string> mutableString { get; set; } // >;)
    }

Источник: http://www.powersemantics.com/

Динамические DTO - необходимый компонент динамического программного обеспечения. Чтобы создать динамический процесс, один шаг компилятора - привязать каждую машину в сценарии к ссылочным свойствам, которые сценарий определяет. Динамический DTO создается путем добавления Cvars в коллекцию.

    // a dynamic DTO
    class CvarRegistry : Dictionary<string, Cvar> { }

Разногласия

Примечание: поскольку Wix назвал использование DTO для организации параметров «анти-паттерном», я выскажу авторитетное мнение.

    return View(model);  // MVC disagrees

Моя совместная архитектура заменяет шаблоны проектирования. Обратитесь к моим статьям в Интернете.

Параметры обеспечивают немедленное управление машиной для стекирования кадров. Если вы используете непрерывный контроль и, следовательно, не нуждаетесь в немедленном контроле, ваши модули не нуждаются в параметрах. В моей архитектуре ничего нет. Конфигурация машин (методов) в процессе добавляет сложность, но также увеличивает ценность (производительность), когда параметры являются типами значений. Однако параметры ссылочного типа заставляют потребителя вызывать промахи кеша для получения значений из кучи в любом случае - поэтому просто настройте потребителя со ссылочными свойствами. Факт из машиностроения: опора на параметры - это своего рода предварительная оптимизация, потому что сама обработка (изготовление компонентов) - это отходы. Обратитесь к моей статье W для получения дополнительной информации. http://www.powersemantics.com/w.html.

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

Некоторые считают DTO анемичной моделью предметной области, то есть в ней отсутствуют функциональные возможности, но это предполагает, что объект должен владеть данными, с которыми он взаимодействует. Затем эта концептуальная модель заставляет вас доставлять данные между объектами, что является моделью для распределенной обработки. Однако на производственной линии каждый шаг может получить доступ к конечному продукту и изменить его, не владея им и не контролируя его. В этом разница между распределенной и интегрированной обработкой. Производство отделяет продукт от операций и логистики.

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

person RBJ    schedule 17.04.2020

Я бы объяснил DTO своему ребенку как

Мой сын Data Transfer Object (он же DTO) используется для инкапсуляции данных, которые мы отправляем из одного приложения (api и т. Д.) В другое
Используйте DTO для определения интерфейсов для ввода и вывода для вашей системы

Под системой в этом контексте я имею в виду, что у вас есть несколько конечных точек (веб-приложения, api и т. Д.), Которые вместе образуют систему

person sultanmyrza    schedule 13.03.2021