Я бы посоветовал не использовать DTO между слоями. Я не уверен, что есть какая-то польза, но я буду рад получить инструкции, если вы думаете, что у вас есть какие-то.
Вред заключается в поддержании нескольких параллельных иерархий, которые выражают одну и ту же идею (бизнес-объекты плюс несколько DTO между уровнями). Это означает, что для поддержки требуется больше кода и больше ошибок.
Вот как я бы наложил слои приложений:
view <--- controller <--- service <--- + <--- model
+ <--- persistence
Этот дизайн отделяет взгляды от услуг; Вы можете повторно использовать сервисы с разными взглядами. Методы обслуживания реализуют сценарии использования, проверяют входные данные в соответствии с бизнес-правилами, собственными единицами работы и транзакциями и взаимодействуют с объектами модели и постоянства для выполнения запросов.
Контроллер и вид тесно связаны между собой; изменить вид, изменить контроллер. Представление не делает ничего, кроме отображения данных, предоставленных контроллером. Контроллер отвечает за проверку, привязку, выбор соответствующих служб, предоставление данных ответа и маршрутизацию к следующему представлению.
На соответствующем уровне (обычно это сервисы) применяются сквозные проблемы, такие как ведение журнала, транзакции, безопасность и т. Д.
Службы и постоянство должны быть основаны на интерфейсе.