Слои приложений и DataMapper
Привет, я только что прочитал книгу "Шаблоны архитектуры корпоративных приложений". Они говорят о том, что вы должны делать корпоративные приложения в слоях, и что вы не должны заставлять один слой использовать вышеперечисленный слой, а только один слой внизу... Как и в доменном слое, можно использовать слой БД, но не наоборот. Затем есть глава о DataMappers, которые создают доменные объекты. Там меня немного удивляет, почему он может заставить DataMapper на уровне БД создать объект на уровне домена, поскольку он не следует правилу, согласно которому нижний не вызывает верхний. Поэтому мой вопрос не должен быть объектами домена на самом деле на уровне БД, или каков хороший способ сделать объекты домена без использования уровня БД на уровне домена
3 ответа
Лично я не согласен с тем, что предметная модель является слоем, аналогичным другим слоям, потому что она не содержит никаких поведений, это просто сущность / объект, связанный с доменом.
Другими словами, мы не можем сделать вывод, что он является особенным только для бизнес-уровня. Если вы используете какой-либо компонент ORM, ясно, что Domain-Model используется непосредственно в вашем уровне базы данных, потому что он автоматически сопоставляется внутри.
Я думаю, что проблема в том, что вы делаете некоторые предположения о модели предметной области.
Согласно книге, которую вы упоминаете, Data Mapper на самом деле требуется только для богатой модели предметной области, и в этом случае лучше всего не использовать объектные компоненты в качестве модели предметной области, а использовать вместо этого POJO.
Теперь, если вы пойдете по этому пути, я бы сказал, что классы Data Mapper и Domain Model находятся на одном и том же уровне поверх уровня сохраняемости (который состоит из DAO и сущностей). В этом случае Data Mapper не работает напрямую с базой данных.
Если, с другой стороны, модель предметной области основана на сущностях, то я бы сказал, что она также является частью уровня постоянства, и в этом случае Data Mapper также выполняет роль DAO, поэтому, опять же, они оба (в хотя бы частично) в том же слое.
Какое лучшее решение? В соответствии с книгой, я бы сказал, что имеет смысл использовать сущности в качестве модели предметной области только в очень простых случаях, отдельно для чего-то сложного (см. Модель предметной области в главе 9 этой книги).
Один из подходов к решению обнаруженной вами проблемы - использовать слой абстракции между объектами домена и базой данных.
В двух словах это зависимость инверсия / впрыск.
Вы определяете интерфейс, который определяет все действия, которые может выполнять поставщик данных, затем вы создаете конкретных поставщиков данных, которые реализуют интерфейс, и уровень бизнес-логики / домена связывается с этим. Таким образом, вы не привязаны к базе данных.
Затем вы можете построить средство отображения данных между бизнес-логикой / объектами данных и интерфейсом (если вы хотите использовать его повторно) или как часть доступа к данным, если для этого требуются подробности, специфичные для поставщика данных.