В ddd объект может ссылаться на объекты одного и того же агрегата или на другой совокупный корень (но не на объекты внутри другого агрегата).Как реализовать ссылки beetwen aggregates в ddd?
- Каким будет эта ссылка?
- Как метод объекта получит доступ к ссылочному заполнителю?
- Каков метод объекта, который можно использовать с другим агрегированным корнем?
Для 1. и 2. моя проблема в том, что сущность не должна иметь доступа к репозиториям. Также малые ленивые механизмы загрузки не всегда доступны, и я думаю, что следует избегать по тем же причинам. Итак, когда агрегат загружается репозиторием, должны ли все ссылки каждого объекта в нем быть разрешены (и все ссылки на другие агрегаты будут загружены) репозиторием? Или это «ссылка» только как идентификатор, а кто-то за пределами объекта (командующий или тот, кто загружает агрегат из репозитория и вызывает метод) использует этот идентификатор для загрузки другого агрегата и затем передает его в этот метод как параметр, как в следующем примере?
agg1 = repo1.Load(id);
agg2 = repo2.Load(agg1.refId);
agg1.mymethod(agg2);
Для 3. Я думаю, что только методы, которые должны быть вызваны на другой агрегат будет методы запроса (в ОКК смысле), не меняющие другой агрегат, потому что только один агрегат за одну транзакцию должна быть изменена. Правильно?
Ну, если первый агрегат нуждается во втором, чтобы выполнить его обязанность, вы также можете хранить общую ссылку и полагаться на ORM, способный к регидратации этой структуры. Если вам постоянно приходится загружать 'agg2', тогда это будет иметь смысл для меня, но я могу ошибаться. – plalx