Что такое объект передачи данных? - PullRequest
170 голосов
/ 27 июня 2009

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

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

Ответы [ 6 ]

177 голосов
/ 29 июня 2009

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

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

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

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

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

23 голосов
/ 27 июня 2009

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

18 голосов
/ 27 июня 2009

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

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

10 голосов
/ 27 октября 2012

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

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

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

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

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

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

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

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

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

Например, это наш пользовательский объект:

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

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

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

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

List<UserListItemView> find(Pageable pageable);

Не беспокойтесь о других операциях преобразования * Метод 1043 * отлично работает.

8 голосов
/ 18 марта 2015
  1. Для меня лучший ответ на вопрос что такое DTO заключается в том, что DTO - это простые объекты, которые не должны содержать никакой бизнес-логики или реализации методов, которые потребовали бы тестирования .
  2. Обычно ваша модель (использующая шаблон MVC) представляет собой интеллектуальные модели, и они могут содержать множество / некоторые методы, которые выполняют некоторые другие операции для этой модели конкретно (не бизнес-логика, это должно быть на контроллерах). Однако, когда вы передаете данные (например, вызываете конечную точку REST (GET / POST / что угодно) откуда-либо, или используете веб-сервис с использованием SOA и т. Д.), Вы не хотите передавать объект большого размера с код, который не нужен для конечной точки, будет потреблять данные и замедлять передачу.
5 голосов
/ 27 июня 2009

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

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

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

...