Шаблон репозитория: репозиторий для агрегата или для каждого хранилища данных? - PullRequest
1 голос
/ 14 марта 2011

Рекомендуется иметь один репозиторий на агрегат.

Однако у меня есть случай, когда один и тот же агрегатный объект может быть выбран из 2 разнородных хранилищ данных,Для фона этот объект:

  1. выбран из хранилища данных A (удаленный и только для чтения)
  2. предоставлен пользователю для проверки
  3. при проверке, импортируется в хранилище данных B (локальный и чтение-запись)
  4. его можно получить и изменить в хранилище данных B

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

Учитывая, что доменслой должен игнорировать инфраструктуру, мой конкретный случай как-то нарушает мое понимание того, как шаблон хранилища и DDD в целом должны быть правильно реализованы.

Я что-то не так понял?

1 Ответ

4 голосов
/ 14 марта 2011

Я что-то не так понял?

Мне кажется, что вы ошиблись, имея два хранилища данных для одних и тех же данных.

Если действительно есть веская причина для такой избыточности, два агрегата должны каким-то образом отличаться, и это может оправдать рассмотрение их как отдельных агрегатов и наличие двух репозиториев.

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

EDIT:

В ситуации, описанной в комментариях, когда одно хранилище данных доступно только для чтения, а другое - локальная модифицируемая копия, наличие двух хранилищ данных фактически навязано вам. Ваш репозиторий должен знать об обоих хранилищах данных и использовать удаленное хранилище только для чтения, только если он не находит что-то локально. Сразу после извлечения чего-либо с пульта он должен сохранить его на локальном компьютере, а затем использовать локальную копию.

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

В этой ситуации также есть некоторые риски, о которых вам нужно подумать. После того как вы сохранили что-то локально, у вас есть две версии одинаковых данных, которые будут синхронизированы. Что вы делаете, если кто-то с доступом для записи на пульте изменит его после того, как вы поменяли местное?

...