Мы долго и пристально изучаем наши (Java) шаблоны веб-приложений.В прошлом мы страдали от чрезмерно анемичной объектной модели и чрезмерно процедурного разделения между контроллерами, службами и DAO, когда между ними перемещались простые объекты значений (в основном, просто пакеты данных).Мы использовали декларативный (XML) управляемый ORM (Hibernate) для сохранения.Все управление объектами осуществлялось в DAO.
Пытаясь перейти к более богатой модели предметной области, мы сталкиваемся с тем, как наилучшим образом спроектировать постоянный уровень.Я потратил много времени на чтение и размышление о шаблонах, управляемых доменом.Тем не менее, я хотел бы получить несколько советов.
Во-первых, вещи, в которых я увереннее:
У нас будут "тонкие" контроллеры спереди, которыеработать только с HTTP и HTML - формами обработки, проверкой, логикой пользовательского интерфейса.
У нас будет слой сервисов бизнес-логики без сохранения состояния, который реализует общие алгоритмы или логику, не зная UI,но очень хорошо осведомлен (и делегировал) модель предметной области.
У нас будет более богатая модель предметной области, которая содержит состояние, отношения и логику, присущие объектам в этой предметной модели..
Вопрос заключается в настойчивости.Ранее наши сервисы вводились (через Spring) в DAO и использовали методы DAO, такие как find () и save (), для выполнения постоянства.Однако более богатая модель домена, по-видимому, подразумевает, что объекты должны знать, как сохранять и удалять себя, и, возможно, что службы более высокого уровня должны знать, как находить (запрашивать) объекты домена.
Здесь несколько вопросови возникают неопределенности:
Мы хотим внедрить DAO в доменные объекты, чтобы они могли делать this.omeDao.save (this) в методе save ()?Это немного неловко, поскольку доменные объекты не являются одиночными, поэтому нам понадобятся фабрики или настройки DAO после создания.При загрузке сущностей из базы данных это становится грязным.Я знаю, что Spring AOP может быть использован для этого, но я не смог заставить его работать (используя Play! Framework, другую линию экспериментов), и это кажется довольно грязным и волшебным.
Должны ли мы вместо этого хранить DAO (репозитории?) Полностью раздельно, наравне с сервисами бизнес-логики без сохранения состояния?Это может иметь некоторый смысл, но это означает, что если «сохранить» или «удалить» являются неотъемлемыми операциями объекта домена, объект домена не может выразить их.
Мы простополностью отказаться от DAO и использовать JPA, чтобы позволить сущностям управлять собой.
В этом заключается следующая тонкость: довольно удобно отображать сущности с использованием JPA.Игра!Framework также дает нам хороший базовый класс сущности с такими операциями, как save () и delete ().Однако это означает, что наши сущности модели предметной области довольно тесно связаны со структурой базы данных, и мы передаем объекты с большим количеством логики постоянства, возможно, вплоть до уровня представления.Если ничего другого, это сделает модель предметной области менее пригодной для повторного использования в других контекстах.
Если мы хотим избежать этого, нам понадобится какое-то отображение DAO - либо с использованием простого JDBC (или по крайней мереSpring JdbcTemplate), или использующий параллельную иерархию объектов базы данных и «бизнес» сущностей, с DAO, которые всегда копируют информацию из одной иерархии в другую.
Какой здесь уместный выбор дизайна?
Martin