Кажется вероятным, что вы на самом деле смотрите здесь на другой ограниченный контекст. Вы упомянули в своем вопросе, что "репозиторий... может извлекать только совокупные корни."; это верно. В другом ответе также упоминается, что если вам нужно запросить дочерний объект, дочерний объект также может быть совокупным корнем. Это также может быть правильным в другом ограниченном контексте. Вполне возможно, что сущность может быть совокупным корнем в одном контексте и сущностью-значением в другом.
Возьмем, к примеру, домен Users
и мобильный/планшет Apps
, которые они установили на свои устройства. В контексте пользователя нам могут понадобиться основные свойства пользователя, такие как имя, возраст и т. д., а также нам может понадобиться список приложений, которые пользователь установил на свое устройство. В этом контексте User
— это совокупный корень, а App
— это объект-значение.
bounded context UserApps
{
aggregate root User
{
Id : Guid
Name : string
Age : int
InstalledApps : App list
}
value object App
{
Id : Guid
Name : string
Publisher : string
Category : enum
}
}
В другом контексте мы можем взглянуть на мир с точки зрения App
и решить, что App
является совокупным корнем. Скажем, например, мы хотели сообщить, какие пользователи установили данное приложение.
bounded context AppUsers
{
aggregate root App
{
Id : Guid
Name : string
InstalledBy : User list
}
value object User
{
Id : Guid
Name : string
InstalledOn : Date
}
}
Оба этих ограниченных контекста будут иметь собственный репозиторий, который возвращает соответствующий совокупный корень. Есть тонкая, но важная разница в вашей точке зрения на данные.
Я думаю, что если вы сделаете шаг назад и подумаете, почему вам нужно запрашивать дочерний объект, вы можете обнаружить, что фактически находитесь в совершенно отдельном ограниченном контексте.
person
MattDavey
schedule
26.11.2013
GetChildByID(..)
в классеChildRepository
? - person Ahmed KRAIEM   schedule 25.11.2013ChildRepository
. Это подорвало бы всю цель агрегатов. - person MattDavey   schedule 27.11.2013