Как мне обеспечить соблюдение отношений и ограничений между агрегированными корнями?

У меня есть пара вопросов относительно взаимосвязи между ссылками между двумя совокупными корнями в модели DDD. Обратитесь к типичной модели «Клиент / Заказ», представленной ниже.

enter image description here

Во-первых, должны ли ссылки между фактической реализацией агрегатов всегда осуществляться через значения идентификаторов, а не ссылки на объекты? Например, если мне нужны подробные сведения о клиенте Заказа, мне нужно будет взять CustomerId и передать его ICustomerRepository, чтобы получить Клиента, а не настраивать объект Заказа для непосредственного возврата Клиента? Я сбит с толку, потому что возврат клиента напрямую, похоже, упростит написание кода для модели, и его не намного сложнее настроить, если я использую ORM, например NHibernate. Тем не менее, я совершенно уверен, что это нарушит границы между совокупными корнями / репозиториями.

Во-вторых, где и как следует применять каскадное отношение удаления для двух совокупных корней? Например, скажем, я хочу, чтобы все связанные заказы удалялись при удалении клиента. Метод ICustomerRepository.DeleteCustomer () не должен ссылаться на IOrderRepostiory, не так ли? Похоже, что это нарушит границы между агрегатами / репозиториями? Должен ли я вместо этого иметь службу CustomerManagment, которая обрабатывает удаление клиентов и связанных с ними заказов, которые будут ссылаться как на IOrderRepository, так и на ICustomerRepository? В таком случае, как я могу быть уверен, что люди знают, что для удаления клиентов нужно использовать Сервис, а не репозиторий. Это просто их обучение тому, как правильно использовать модель?

11
задан Eric Anastas 25 May 2011 в 00:58
поделиться