Получить ссылку на объект другой агрегат по идентификаторам

Один агрегат должен ссылаться на другой агрегат по идентификаторам, например: порядок хранит идентификатор пользователя. Поэтому, если мне нужно, чтобы пользовательский объект сделал что-то в совокупности заказов, я должен передать его следующим образом: order.doSomthing(user). Но где я должен получить пользователя в службе приложений или службе домена?


person Agustin Castro    schedule 21.05.2018    source источник
comment
Это слишком зависит от контекста, чтобы дать общий ответ. Упоминание службы домена и управления агрегатом из другого агрегата также предполагает проблемы с дизайном. Вы должны быть более конкретными в отношении того, что Order пытается здесь сделать.   -  person guillaume31    schedule 30.05.2018


Ответы (1)


Вы этого не сделаете.

Агрегат работает/зависит только от данных, которыми он владеет. Это относится не только к записи, но и к чтению.

Если агрегату, например User, нужны данные от другого агрегата, например Order, то служба приложений (или, что наиболее вероятно, Saga/диспетчер процессов) получает данные от Order и передает их User:

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