Архитектура MVC DTO/отображение/преобразование моделей
используя Spring MVC, мы обычно видим уровень контроллера, сервиса и репозитория. Слой репозитория использует модель сущностей, которая является сопоставлением один к одному с базой данных. Я подумал о том, чтобы последовать за ... --1-->
- должен ли слой обслуживания использовать ту же модель сущности?
- должен ли уровень обслуживания использовать отдельную модель домена? Если да, то отображение туда / сюда должно выполняться на уровне сервиса?
- должен ли уровень контроллера мы использовать ту же модель домена?
- должны Уровень контроллера использует отдельную модель DTO? Если да, то отображение туда / сюда должно выполняться в слое контроллера?
- есть ли простой способ сделать отображение не писать слишком длинный код? Я использовал Dozer несколько раз в прошлом.
этот вопрос, возможно, был задан, но я не мог найти. Так что извините за дубликат вопроса.
3 ответов
- да.
- нет. Служба должна работать с моделью сущности, возвращаемой объектом репозитория.
- нет. Контроллер должен использовать DTO. DTO должен содержать поля формы и аннотации проверки (если вы используете JSR303).
- да. DTOs используются на уровне контроллера. DTOs должен предоставить конструктор, который принимает модель сущности. Преобразование модели сущности в DTO выполняется в этом конструкторе. Тот же случай для модели сущности. Модель сущностей также должна предоставлять перегруженный конструктор, который принимает объект DTO в качестве аргумента. Преобразование DTO в Entity model должно произойти здесь.
- перегруженный конструктор DTO (Entity model as arg) и Entity model (DTO as arg) являются подробными.
1) да
2) нет
3,4) используйте entitys для вывода, но используйте CommandObjects и DTOs (но не сущности) для ввода. Это зависит от вашей архитектуры, но я не хочу, чтобы клиент маниуплатил каждое поле ваших сущностей, тогда вам нужно отделить объекты, используемые для сопоставления запросов (commandobjects) от ваших сущностей домена.
модель сущности, используемая на уровне сервиса, должна быть одинаковой. В зависимости от архитектуры и сложности приложения может потребоваться использовать различные модели домена на уровне сервиса и контроллера. Моя рекомендация:
- службы всегда работают с объектами, которые извлекаются и хранятся с помощью базы данных
- службы всегда принимают DTOs или простые типы в качестве параметров и возвращают только DTOs. Почему? Потому что DTOs отделены из базы данных, и вы не сталкиваетесь с LazyInitializationException, и вам не придется использовать open-session-in-view anti-pattern.
- подумайте о DTOs как единственной модели, разделяемой между службами и контроллерами
- для сопоставления между сущностью и объектами DTO я рекомендую использовать ModelProjector. Это очень просто, постный и оставляет минимальный след
ModelProjector простые карты одной модели в другую путем сопоставления имен свойств. Если они не совпадают, вы можете сказать это с аннотацией, также можно отобразить сложные иерархии сущностей на "сплющенные" структуры данных с очень прямыми аннотациями. Классы сущностей остаются нетронутыми.