В приведенном ниже сценарииDDD - объект домена (aggreagate) с большой коллекцией другого субъекта
class Group {
...
Set<User> users;
...
}
, где число пользователей в 6-ти цифр, то можно с уверенностью предположить, что выполнение какой-либо операции по коллекции Неэффективное прямое использование любого ORM (JPA/Hibernate в Java, возможно, может быть обработано с помощью ExtraLazyCollection спящего режима).
Чтобы справиться с такой ситуацией, нормально ли, что вместо представления отношения домена между агрегатом и скомпонованным объектом в виде коллекции может быть представлено как операция, поддерживаемая DomainService, а затем репозиторием.
class Group {
User addUser(User anUser, GroupUserService aGroupUserService){ ... }
void removeUser(User anUser, GroupUserService aGroupUserService){ ... }
}
class GroupUserService {
GroupRepository groupRepository;
User addUser(User anUser) {
groupRepository.addUser(anUser);
}
}
class GroupRepository {
User addUser(User anUser) {
//execute the query(JQL or native) to save the user
}
}
делает этот звук как разумное решение, не нарушая принципы DDD, есть оптимизация, которая в настоящее время по-смотрел в этом случае.
Ссылки на полные объекты 'User' - это не единственный способ его моделирования - как насчет того, чтобы иметь список своих идентификаторов? Это то, что рекомендуется, когда «Пользователь» является совокупным корнем. – guillaume31
Кроме того, я думаю, вы должны больше подумать о своем агрегатном дизайне на транзакционном уровне. Огромная коллекция объектов будет не только неэффективной, но также вызовет много споров в Агрегате, который ей владеет. Каждый, кто хочет редактировать «Пользователь» в заданной «Группе», должен будет инициировать транзакцию в той же «Группе», что может привести к проблемам с блокировкой, если есть много параллельных транзакций. – guillaume31