Мне любопытно, как объединить данные из нескольких агрегатных корней в модели чтения для агрегатного корня из источника. Можно попытаться взять простой пример:
Если у меня есть объединенный корень с именем Cart, который поддерживает следующие события в своем потоке событий (свойства в скобках - имейте в виду, это простой пример):
AddProductToCart(cartId: Int, productId: Int)
RemoveProductFromCart(cartId: Int, productId: Int)
AddUserLicenseToProduct(cartId: Int, productId: Int, userId: Int)
RemoveUserLicenseFromProduct(cartId: Int, productId: Int, userId: Int)
EmptyCart(cartId: Int)
Это нормально при проецировании прочитанных моделей с данными, поступающими из этого потока событий. Я могу, например, проецировать объект корзины, который выглядит примерно так:
Cart(cartId: Int, products: List[Product])
Product(productId: Int, userLicenses: List[UserLicense])
UserLicense(userId: Int)
Но как можно объединить данные из другого совокупного корня в другом контексте в эту проекцию корзины. Например, если я хотел расширить модель чтения данными из корня агрегата Продукта, который находится в другом контексте. Допустим, я хотел бы расширить его с помощью productName и productType.
Учтите, что мы работаем в распределенной системе, где продукт и корзина будут работать в разных сервисах / приложениях.
Полагаю, одним из решений было бы включение данных в команды и события. Но это, кажется, не очень хорошо масштабируется, если бы у вас были большие модели чтения с данными из нескольких совокупных корней. Также нужно уметь сбрасывать ядерные бомбы и перестраивать модель чтения.
Я полагаю, что другим решением было бы дублировать данные из других совокупных корней в хранилище других приложений / служб / контекстов. Например, скопируйте данные productName и productType в хранилище, которое принадлежит приложению Cart, но не должно быть частью потока событий Cart. В этом случае приложение Cart должно будет прослушивать события (например, ProductCreated, ProductNameChanged), чтобы обновлять данные. Я думаю, это может быть жизнеспособным решением.