Вот как я бы наложил слой на приложение:
- View
- Контроллер
- Услуги
- Настойчивость
Просмотр возможен на настольном компьютере, в браузере или на мобильном устройстве.
Контроллер тесно связан с просмотром. Он отвечает за проверку и привязку ввода к объектам модели, вызов сервисов для выполнения сценариев использования и маршрутизацию ответа на следующее представление.
Сервисы выполняют сценарии использования. Они знают о единицах работы, собственных транзакциях и управляют соединениями с такими ресурсами, как базы данных. Они работают с модельными объектами, другими сервисами и объектами персистентности. Они являются объектами на основе интерфейса, но могут быть удалены или представлены в виде веб-служб - RPC-XML, SOAP, REST или других.
Постоянство - это еще один интерфейсный объект. Реализация может быть реляционной или NoSQL; важно то, что интерфейс выражает операции CRUD для объектов модели. Если вы используете дженерики, можно написать один интерфейс, который будет работать для всех.
Я бы не позволил модельным объектам сохраняться. Я знаю об уничижительной «анемичной доменной модели», но думаю, что более захватывающее поведение должно быть сосредоточено вокруг бизнес-целей, а не операций CRUD.