Постоянство, инкапсулированное через домен, или постоянство через репозиторий? - PullRequest
1 голос
/ 02 декабря 2010

Если моя модель домена не должна знать / заботиться о репозитории, то как такое поведение, как .UpdateOrder(...), которое инкапсулирует CRUD-обновление, взаимодействует с репозиторием?Через доменную службу?

Хорошо, тогда мой репозиторий имеет эффективное CRUD-обновление, которое используется вместе с моим .UpdateOrder(...).Все в порядке.Но я не хочу, чтобы кто-то использовал метод Update в репозитории, я хочу, чтобы он прошел через поведение на Entity (вместо этого используйте UpdateOrder ()).Я бы предпочел, чтобы по аналогии с тем, как моя модель предметной области удовлетворяет инвариантам - по своему дизайну (свойства частного набора и т. Д.) - мой репозиторий не предоставляет альтернативный метод для «обновления» / сохранения сущности.1007 *

Является ли это просто проблемой модификатора доступа, которую я решил, не имея метода Update в общедоступной репо.Или есть «лучший» ответ?Пожалуйста, помогите мне DDD ниндзя.

Ответы [ 2 ]

3 голосов
/ 03 декабря 2010

Строгая последовательность в DDD будет:

var entityRepository = MyServiceLocator.Get<IEntityRepository>();
var myEntity = entityRepository.Load(<some criteria>);
myEntity.Change(something);
entityRepository.Save(myEntity);

Хранилище всегда отвечает за обнаружение / сохранение всех изменений внутри объекта.

(кстати, я предполагаю,что ваша сущность является совокупным корнем)

2 голосов
/ 03 декабря 2010

Если модель вашего домена не включает в себя постоянство, то она не включает операцию сохранения чего-либо.Если ваша сущность является чем-то из модели предметной области, то она не имеет бизнеса, сохраняющего себя.

Вы говорите:

Это нормально.Но я не хочу, чтобы кто-то использовал метод Update в репозитории, я хочу, чтобы он прошел через поведение на Entity

Но я думаю, что это ошибка.Ваши доменные объекты не несут большей ответственности за сохранение себя, чем за печать, рисование себя на экране и т. Д. В вашем доменном классе не должно быть метода UpdateOrder.

Теперь вы можете этого не делатьВы хотите показать необработанный репозиторий (из уровня реализации сохраняемости) другому коду, но это просто означает, что его нужно обернуть во что-то подходящее.Похоже, у вас есть код, который должен говорить о постоянстве, поэтому выясните, на каком уровне дискурса он должен работать, и предоставьте ему подходящий интерфейс.

...