У меня есть пара вопросов относительно взаимосвязи между ссылками между двумя совокупными корнями в модели DDD. См. Типичную схему заказа клиента/заказа, приведенную ниже.
Во-первых, должны ли ссылки между фактической реализацией объектов агрегатов всегда выполняться через значения идентификатора, а не ссылки на объекты? Например, если мне нужна информация о заказчике заказа, мне нужно будет взять CustomerId и передать его в ICustomerRepository, чтобы получить Клиента, а не настроить объект Order, чтобы вернуть Клиенту прямо правильно? Я смущен, потому что возвращение клиента напрямую кажется, что это упростит код для написания кода для модели, и настроить его гораздо сложнее, если я использую ORM, например, NHibernate. Тем не менее, я уверен, что это нарушит границы между совокупными корнями/репозиториями.
Во-вторых, где и как должен применяться каскад в отношении удаления для двух совокупных корней? Например, я хочу, чтобы все связанные заказы были удалены при удалении клиента. Метод ICustomerRepository.DeleteCustomer() не должен ссылаться на IOrderRepostory, если он? Похоже, это нарушит границы между агрегатами/репозиториями? Должен ли я вместо этого иметь службу CustomerManagment, которая обрабатывает удаление клиентов и связанных с ними ордеров, которые будут ссылаться как на IOrderRepository, так и на ICustomerRepository? В этом случае, как я могу быть уверен, что люди знают, как использовать Сервис, а не репозиторий для удаления Клиентов. Разве это просто до обучения их правильному использованию модели?