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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

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

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

Некоторые ORM Frameworks имеют возможность проекции с использованием дополнительных интерфейсов или классов. Таким образом, репозитории могут напрямую возвращать объекты 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 ...
}

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

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

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

List<UserListItemView> find(Pageable pageable);

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

Ответ 5

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

Ответ 6

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

От Wikipedia:

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

Ответ 7

DTO существуют перед лицом традиционной мудрости DonotRepeat Yourself. Будьте очень осторожны и будьте абсолютно уверенны, что вам нужен DTO