Шаблон репозитория: репозиторий для агрегата или для каждого хранилища данных?
Рекомендуется иметь один репозиторий на агрегат.
Однако у меня есть случай, когда один и тот же агрегатный объект может быть получен из 2 разнородных хранилищ данных. Для фона этот объект:
- извлекается из хранилища данных A (удаленно и только для чтения)
- представлены пользователю для проверки
- при проверке, импортируется в хранилище данных B (локальное и чтение-запись)
- его можно получить и изменить в хранилище данных B
Очевидно (или нет), у меня не может быть уникального агрегатного репозитория для этого - в какой-то момент мне нужно знать, из какого хранилища данных извлекается объект.
Учитывая, что уровень домена должен игнорировать инфраструктуру, мой конкретный случай каким-то образом нарушает мое понимание того, как шаблон репозитория и DDD в целом должны быть правильно реализованы.
Я что-то не так понял?
1 ответ
Я что-то не так понял?
Мне кажется, что вы ошиблись, имея два хранилища данных для одних и тех же данных.
Если действительно есть веская причина для такой избыточности, два агрегата должны быть в некотором роде разными, и это может оправдать рассмотрение их в качестве отдельных агрегатов и наличия двух репозиториев.
Если вы хотите рассматривать их как единую совокупность, один репозиторий должен знать, как устранить неоднозначность и правильно обращаться с хранилищем данных, но инкапсулировать эти знания хранилищ данных вне вашей доменной модели.
РЕДАКТИРОВАТЬ:
В ситуации, описанной в комментариях, когда одно хранилище данных доступно только для чтения, а другое - локальная модифицируемая копия, наличие двух хранилищ данных фактически навязано вам. Ваш репозиторий должен знать об обоих хранилищах данных и использовать удаленное хранилище только для чтения, только если он не находит что-то локально. Сразу же после извлечения чего-либо с удаленного устройства оно должно сохранить его на локальном компьютере, а затем использовать локальную копию.
Эта логика является своего рода кэширующим прокси, но не совсем так, поскольку удаленный доступ только для чтения, а локальный - для чтения и записи. Он может содержать достаточно логики для извлечения в службу, используемую хранилищем, но не должен быть открыт для домена.
Эта ситуация также имеет некоторые риски, о которых вам нужно подумать. После того, как вы сохранили что-то локально, у вас есть две версии одних и тех же данных, которые будут синхронизированы. Что вы делаете, если кто-то с доступом для записи на пульте изменит его после того, как вы поменяли местное?