2015-03-07 2 views
0

Я следующую операцию службы в моем ICustomerService:Сохранить связанные объекты в DDD

public void RegisterCustomer(Customer customer) 
{ 
    Check.NotNull(customer, "customer"); 

    //do another domain specific things... 

    customerRepository.Save(customer); 
} 

Редактировать

класс Customer имеет ссылку на ICollection <> из CustomerAddress лица.
Эта операция также должна сохранять список адресов клиентов.

Я знаю, что делать каскадные обновления не является хорошей вещью в этом сценарии:

How should I handle persistence for referenced entities?

С точки зрения DDD, как я должен делать в этом случае?
Должен ли я запрашивать список адресов клиентов в сервисной операции через параметр?

+1

Есть хорошие шансы, что 'CustomerPhone' является объектом значения, а не сущностью. У 'CustomerPhone' действительно есть своя собственная личность и состояние? Если у вас есть два экземпляра 'CustomerPhone' с одинаковым номером, не будут ли они равными и взаимозаменяемыми? Если это так, то они должны быть объектами ценности, а не сущностями. – plalx

+0

@plalx, ​​я отредактировал мой вопрос. Предполагая, что адрес клиента не является объектом значений в этом случае. Как я должен обрабатывать операции «SaveComplete»? Должен ли я взять только объект по параметру и использовать их ссылки или взять все связанные объекты, которые будут сохранены? –

ответ

0

Если вы спросите CustomerPhone, вы можете разбить (или не обязательно) инвариант объекта Customer. Одним из подходов является использование Memento pattern. Извлеките внутреннее состояние вашего клиента в объект Memento и передайте этот Memento в репозиторий.

0

Я знаю, что делать каскадные обновления не является хорошей вещью в этом сценарии:

Почему? Пока CustomerAddress - это простая сущность, а не Агрегатный корень, у вас есть все, что можно получить, позволяя EF сохранять их вместе с Customer.

Судя по вашему другому вопросу, я думаю, что вы можете пропустить разницу между суммарным корнем и сущностью. Здесь вы должны начать - создавать свои агрегаты, решать, какие объекты должны быть AR, простыми объектами и объектами Value.

Оттуда все должно встать на свои места в соответствии с некоторыми простыми правилами: один репозиторий на АР, сущности могут иметь только ссылки на сущности из одного и того же агрегата, лучше, если AR ссылается на другое AR по его идентификатору, а VO может ссылаться откуда угодно.

Смежные вопросы