Один агрегат должен ссылаться на другой агрегат по идентификаторам, например: порядок хранит идентификатор пользователя. Поэтому, если мне нужно, чтобы пользовательский объект сделал что-то в совокупности заказов, я должен передать его следующим образом: order.doSomthing(user). Но где я должен получить пользователя в службе приложений или службе домена?
Получить ссылку на объект другой агрегат по идентификаторам
Ответы (1)
Вы этого не сделаете.
Агрегат работает/зависит только от данных, которыми он владеет. Это относится не только к записи, но и к чтению.
Если агрегату, например User
, нужны данные от другого агрегата, например Order
, то служба приложений (или, что наиболее вероятно, Saga/диспетчер процессов) получает данные от Order
и передает их User
:
user.doSomething(order.some, order.info)
person
Constantin Galbenu
schedule
21.05.2018
так вы имеете в виду, что в службе приложений пользователя у меня будет orderRepository для получения заказа? например: UserApplicationService { method() { orderId = user.orderId(); order = orderRepository->findById(orderId); user.doSomething(порядок) } }
- person Agustin Castro; 21.05.2018
@AgustinCastro нет. Пользователь не является владельцем Заказа. У вас будет что-то вроде:
user.doSomething(order.some, order.info)
- person Constantin Galbenu; 21.05.2018
Понятно, а как получить заказ? и по следующей ссылке: stackoverflow. com/questions/4919687/ есть парень (Дэвид Мастерс), который говорит: Тогда, если есть доменная логика, включающая оба агрегата, это можно извлечь в доменную службу и выглядеть примерно так: он извлекает оба агрегата из разных репозиториев и выполните agg1.DoSomething(agg2);
- person Agustin Castro; 21.05.2018
@AgustinCastro, вы просто загружаете оба агрегата из репозитория. Что касается этой ссылки: я не согласен; это создало бы ненужную связь между двумя агрегатами.
- person Constantin Galbenu; 21.05.2018
Поэтому я должен сделать что-то вроде этого: UserApplicationService { method() { orderId = user.orderId(); order = orderRepository->findById(orderId); user.doSomething(order.some, order.info) } } верно?
- person Agustin Castro; 21.05.2018
@AgustinCastro да.
- person Constantin Galbenu; 21.05.2018
Order
пытается здесь сделать. - person guillaume31   schedule 30.05.2018