Связь между контроллером и фасадом, запрос трансформации => dto - PullRequest
0 голосов
/ 29 апреля 2019

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

Методы в фасаде требуют некоторого DTO и некоторой бизнес-логики.

В 90% случаев запрос, поступающий на карты контроллера 1-1, аргумент DTO метода фасада.

Мой вопрос таков: является ли хорошей практикой использование одного и того же класса для принятия запроса в контроллере и последующего использования в качестве DTO на фасаде?

1 Ответ

1 голос
/ 29 апреля 2019

Я не скажу, что есть абсолютно правильный способ сделать это.

Если ваше приложение довольно простое, например, просто операции с базой данных для создания и извлечения данных, простая модель данных и без сложной бизнес-логики, тогда может быть хорошо использовать тот же DTO. Этот сценарий в основном не соответствует действительности.

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

Если вы возьмете пример (немного надуманный вариант использования, чтобы выявить то, что я делаю):

Предположим, что пользователи могут создавать клиентов в вашем приложении через конечную точку ReST, и существует четко определенная модель запроса:

class CustomerDTO {
  private String firstName;
  private String lastName;
  private String companyId;
  private String email;
  private List<String> subscriptions; // customers subscribe to services
}

Предположим, модель вашего домена:

class CustomerBO {
  private String name;   // firstName + lastName
  private String companyId;
  private String email;
  private List<String> subscriptions; // customers subscribe to services
}

Позже, если вы хотите добавить возможность создавать сущности, читая их из очереди сообщений или файла CSV - ваше приложение может быть нисходящей системой, получающей канал из другого приложения. В этом случае у вас есть следующие отличия от варианта использования API:

  • каждый клиент имеет только 1 подписку (всегда)
  • имя отправляется одним полем
  • электронной почты нет, поскольку эти клиенты не являются настоящими пользователями (то есть, не нужно отправлять электронные письма, входить в систему и т. Д.)

Итак, ваша модель запроса выглядит так:

class FeedCustomerDTO {
  private String name;
  private String companyId;
  private String subscriptionId;
}

Теперь ядро ​​приложения просто принимает CustomerBO. Модули API и Feed преобразуют модели запросов в согласованную модель предметной области. Вы можете видеть, что наличие согласованного CustomerBO для этих двух вариантов использования помогает поддерживать чистоту ядра вашего приложения и от взаимодействия с ним.

Надеюсь, что это имеет смысл и отвечает на ваш запрос.

...