1

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

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

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

+0

Что делает UpdateOrder и какие параметры требуется? Является ли это буквальным обновлением постоянного хранилища со значениями в Entity? – 2010-12-02 16:53:10

+0

UpdateOrder - это поведение бизнес-модели. На самом деле не имеет значения, что требуется или делает, за исключением того, что он инкапсулирует логику домена, и в конце ему нужно сохранить измененное состояние. – 2010-12-03 13:15:07

ответ

3

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

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

Хранилище всегда отвечает за обнаружение/сохраняющихся все изменения в пределах сущности.

(кстати, я предполагаю, что ваша организация представляет собой совокупность корень)

2

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

Вы говорите:

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

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

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