Шаблон репозитория: репозиторий для агрегата или для базового хранилища данных?

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

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

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

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

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

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


person Maxim Gueivandov    schedule 14.03.2011    source источник


Ответы (1)


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

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

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

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

ИЗМЕНИТЬ:

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

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

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

person Don Roby    schedule 14.03.2011
comment
@Don: Мне кажется, что вы ошиблись, так это наличие двух хранилищ данных для одних и тех же данных -> Хранилище данных A является удаленным референсом, к которому у меня нет доступа для записи. В какой-то момент мне нужно представление этих данных в локальном хранилище данных B по соображениям производительности и для возможной модификации. - person Maxim Gueivandov; 14.03.2011
comment
@Maxim Gueivandov: Для этого я бы использовал единый репозиторий и скрыл решение о том, какое хранилище данных в репозитории, чтобы не загрязнять домен знаниями. - person Don Roby; 14.03.2011
comment
@Don: Если вы хотите рассматривать их как единый агрегат, один репозиторий должен уметь устранять неоднозначность и работать с правильным хранилищем данных: как этого можно достичь? - person Maxim Gueivandov; 14.03.2011
comment
@Maxim: Смотрите мое обновление. Это слишком долго, чтобы оставить комментарий. - person Don Roby; 14.03.2011
comment
@Don: спасибо за разъяснения. Однако требование № 2 (объект должен быть представлен пользователю для проверки перед импортом) запрещает мне молча синхронизировать 2 хранилища данных. Мне нужен способ различить 2 источника данных до уровня представления. Я считаю, что ваше предложение иметь 2 разных репозитория, поэтому 2 разных (но структурно идентичных) совокупных объекта лучше всего соответствуют этому требованию. Вы не согласны? - person Maxim Gueivandov; 14.03.2011
comment
@Maxim: Хотя это может быть вполне разумным в вашей ситуации, у меня возникнет соблазн попробовать рассмотреть эту проверку как часть вашей модели предметной области. То есть используйте один агрегат и один репозиторий и отметьте вещь как проверенную или нет, по умолчанию ложную. Затем репозиторий может сохраниться в локальном хранилище данных только после проверки. - person Don Roby; 14.03.2011