В каком слое должны находиться репозитории? - PullRequest
6 голосов
/ 17 августа 2010

В каком слое должны находиться классы хранилища? Домен или инфраструктура?

Ответы [ 3 ]

18 голосов
/ 23 августа 2010

Репозиторий Интерфейсы являются частью домена. Фактическая реализация интерфейсов должна быть частью инфраструктуры.

4 голосов
/ 09 апреля 2015

Классы реализации репозитория вместе с отдельными интерфейсами (если они существуют) должны переходить на уровень домена .

Причина заключается в фундаментальном правиле, которому необходимо следовать в многоуровневой архитектуре.: нижний уровень не должен зависеть от более высокого уровня .

Если мы примем это правило (в противном случае это не многоуровневая архитектура), то размещение реализаций репозитория на уровне инфраструктуры сделает его зависимымна доменном уровне, следовательно, нарушая фундаментальное правило наложения слоев.

Например, когда мы создаем новую сущность домена, мы помещаем ее в доменный слой;и поскольку хранилище (и его интерфейс, и его реализация) неизбежно должны зависеть от сущности домена, это означает, что хранилище также должно входить в уровень домена.В противном случае мы изменили бы уровень инфраструктуры всякий раз, когда объект домена был добавлен / удален / изменен на уровне домена.

Другие проблемы, такие как поддержание уровня домена "чистым" и независимым от постоянных деталей, могут идолжно быть достигнуто путем использования соответствующих инфраструктурных сервисов из реализаций внутри уровня домена.Например, в Java мы можем использовать JPA для реализации репозиториев с очень небольшим кодом, и без SQL / JDBC или кода, специфичного для базы данных (действительно ли это хорошая идея для реализации репозиториев с JPA - это другое обсуждение; в любом случае, объекты JPA будутиспользовать аннотации JPA в любом случае).

Ссылки: Википедия , MSDN

2 голосов
/ 17 августа 2010

Полагаю, это зависит от того, как Вы на них положитесь.

Вопрос в том, разрешите ли Вы себе использовать репозитории изнутри домена?
Если так - тогда Вы вынуждены их вставить.

Мне самому нравится размещать их вне домена. Итак - типичный жизненный цикл чего-то выглядит следующим образом =>

UI => Controller => получить агрегатный корень из репозитория => вызвать логику через агрегатный корень => если новый агрегатный корень создан, добавить его в репо.

Иногда контроллер вызывает службу приложения, которая делает некоторые дополнительные вещи, помимо простого извлечения root и вызова функции на нем. Но идея та же - домен ничего не знает о постоянстве.


Хотя (на мой взгляд) нет ничего плохого в том, чтобы размещать репозитории в домене (или, по крайней мере, их абстракции), это делает Ваш домен более осведомленным о постоянстве. Иногда это может решить проблемы, но в целом - это определенно сделает Ваш домен более сложным.

Используйте то, что кажется вам более естественным, и будьте готовы в любое время изменить ваши пути.

...