Что должны вернуть репозитории в DDD - PullRequest
0 голосов
/ 01 апреля 2020

Я исследовал репозитории в DDD и обнаружил совершенно другое. Все говорят о репозиториях по-разному, и это меня смущает.

Я хочу знать

  1. Какие методы должны содержать репозитории?
  2. Что должны репозитории определенно (или ближе) что) вернуть?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 03 апреля 2020

Для каждого агрегата root (AR) у вас должен быть репозиторий. Как минимум, хранилище, вероятно, будет иметь метод void Save(Aggregate aggregate) и Aggregate Get(Guid id). Возвращенный агрегат всегда будет полностью сформирован.

Я иногда добавляю методы для определенных c вариантов использования, чтобы обновить только определенные биты данных. Например, что-то вроде void Activate(Guid id) или что-то подобное. Это просто для того, чтобы избежать манипулирования большим количеством данных, чем необходимо.

Запросы к репозиторию обычно проблематичны c, так как обычно вам следует избегать запросов к своему домену. Для такого сценария ios я рекомендую использовать механизм запросов , который ближе к данным и в более сыром формате, чем объект домена или граф объектов. Механизм запросов будет более вероятно возвращать примитивы, такие как int Count(Query.Specification specification) или, возможно, возвращать список прочитанных моделей экземпляров.

0 голосов
/ 03 апреля 2020

Вы правы, хранилище имеет разные значения в разных контекстах - и многие авторы имеют свою интерпретацию. Я понимаю их с разных точек зрения:

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

Поэтому, чтобы ответить на ваши вопросы, хранилища должны содержать методы, связанные с коллекцией, такие как add, remove, addAll, findByCriteria - вместо сохранения, обновления, удаления. Они могут возвращать все агрегаты или части агрегатов или некоторые внутренние агрегатные отношения - это зависит от модели вашего домена и способа представления объектов

0 голосов
/ 01 апреля 2020

Eri c Эванс придумал «доменно-ориентированный дизайн» в 2003 году; поэтому правильной отправной точкой для любых определений в этом контексте является его книга . Он определяет шаблон репозитория в главе 6 («Жизненный цикл объекта домена»).

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

...

Для каждого типа объекта, который требует глобального доступа, создайте объект, который может создать иллюзию коллекции в памяти всех объектов этого типа.

Основной вариант использования репозитория: при заданном ключе возвращается правильный root объект. Реализация репозитория действует как модуль, который скрывает ваш выбор стратегии персистентности (см .: Parnas 1971 ).

...