Что такое объект передачи данных?
Что такое объект передачи данных?
В 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
- Для меня лучший ответ на вопрос, что такое DTO, заключается в том, что DTO - это простые объекты, которые не должны содержать никакой бизнес-логики или реализации методов, которые потребовали бы тестирования.
- Обычно ваша модель (использующая шаблон MVC) представляет собой интеллектуальные модели, и они могут содержать множество/несколько методов, которые выполняют несколько различных операций специально для этой модели (не бизнес-логика, это должно быть на контроллерах). Однако когда вы передаете данные (например, вызываете конечную точку REST (
GET
/POST
/что угодно) откуда-либо, или используете веб-сервис с использованием SOA и т.д.), Вы не хотите передавать объект большого размера с кодом, который не является необходим для конечной точки, будет потреблять данные и замедлять передачу.
Ответ 6
С помощью объектов передачи данных MVC часто используются для сопоставления моделей домена с более простыми объектами, которые в конечном итоге будут отображаться в представлении.
От Wikipedia:
Объект передачи данных (DTO), ранее известный как объекты ценности или VO, является шаблон проектирования, используемый для передачи данных между программным приложением подсистемы. DTO часто используются в сочетании с доступом к данным объекты для извлечения данных из базы данных.
Ответ 7
DTO существуют перед лицом традиционной мудрости DonotRepeat Yourself. Будьте очень осторожны и будьте абсолютно уверенны, что вам нужен DTO