it-swarm.com.ru

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

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

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

167
Yaron Naveh

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

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

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

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

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

173
Benny Hallett

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

23
blu

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

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

18
Eric Petroelje

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

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

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

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

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

Controller слой не знает, что это за сущности. Он связывается с Form и View Value Objects. Объекты форм имеют аннотации JSR 303 Validation (например, @NotNull) и View Value Objects имеют аннотации Джексона для настраиваемой сериализации. (например, @JsonIgnore)

Уровень сервиса связывается с уровнем репозитория с помощью Entity Objects. Объекты 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);

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

10
Fırat KÜÇÜK
  1. Для меня лучший ответ на вопрос что такое DTO это то, что DTO простые объекты, которые не должны содержать никакой бизнес-логики или реализации методов, которые потребовали бы тестирования .
  2. Обычно ваша модель (использующая шаблон MVC) представляет собой интеллектуальные модели, и они могут содержать множество/несколько методов, которые выполняют несколько различных операций специально для этой модели (не бизнес-логика, это должно быть на контроллерах). Однако при передаче данных (например, при вызове конечной точки откуда-либо REST (GET/POST/what)) или при использовании веб-службы с использованием SOA и т.д.) Вы не хотите передавать данные большого размера. объект с кодом, который не нужен для конечной точки, будет потреблять данные и замедлять передачу.
8
Thiago Burgos

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

От Википедия :

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

5
Dan