Настойчивость инкапсулирована через домен или настойчивость через репозиторий?
Вопрос
Если моя модель домена не должна знать / заботиться о репозитории, то как какое-то поведение нравится .UpdateOrder(...)
, что инкапсулирует CRUD-Update, интерфейс с репозиторий? Через доменное обслуживание?
Хорошо, тогда мой репозиторий имеет эффективное обновление Crud-Update, которое используется в сочетании с моим .UpdateOrder(...)
. Отказ Хорошо. Но я не хочу, чтобы кто-то использовал метод обновления на репозитории, я хочу, чтобы они проходили поведение на объекте (используйте UpdateORDER () вместо). Я бы предпочел, чтобы подобное к тому, как мою модель домена удовлетворяет инвариантам - по этому дизайну (личный набор свойств и т. Д.) - Мой репозиторий нет Раскрыть альтернативный метод «Обновление» / сохранять сущность.
Это просто проблема модификатора доступа, которая решается мной, не имея метода обновления в публике REPO. Или есть ли «лучший» ответ? Пожалуйста, помогите мне DDD Ninjas.
Решение
Строгая последовательность в DDD была бы:
var entityRepository = MyServiceLocator.Get<IEntityRepository>();
var myEntity = entityRepository.Load(<some criteria>);
myEntity.Change(something);
entityRepository.Save(myEntity);
Репозиторий всегда отвечает за обнаружение / сохранение всех изменений в рамках объекта.
(Кстати, я предполагаю, что ваша сущность является совокупным корнем)
Другие советы
Если ваша модель домена не включает в себя постоянство, то она не включает операцию хранения чего-либо. Если ваша сущность является чем-то из модели домена, то у нее нет бизнеса не упорно.
Ты говоришь:
Хорошо. Но я не хочу, чтобы кто-то использовал метод обновления на репозитории, я хочу, чтобы они проходили поведение на объекте
Но я думаю, что это ошибается. Ваши доменные объекты несут никакой ответственности за сохранение себя, чем они печатают себя, рисуют себя на экране и т. Д. Ваш класс домена не должна была Метод UpdateOder.
Теперь вы можете не захотеть разоблачить необработанный репозиторий (с вашего уровня реализации настойчивости) к другому коду, но это просто означает обертывание его в чем-то подходящем. Похоже, у вас есть код, который необходимо поговорить о настойчивости, так что выяснить, на каком уровне дискурса ему необходимо работать, и разоблачить подходящий интерфейс к нему.