Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

В общем Объекты значений должен быть неизменяемым.Нравиться Целое число или Нить объекты в Java.Мы можем использовать их для передачи данных между уровнями программного обеспечения.Если уровни программного обеспечения или службы работают на разных удаленных узлах, например в среде микросервисов или в устаревшем приложении Java Enterprise App.Нам необходимо сделать почти точные копии двух классов.Здесь мы встретились с 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 Objects.Объекты сущностей имеют аннотации данных JPA/Hibernate/Spring.Каждый уровень взаимодействует только с нижним уровнем.Межуровневая связь запрещена из-за циклической/циклической зависимости.

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

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

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

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

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

List<UserListItemView> find(Pageable pageable);

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top