DDD — Ограничение репозитория для создания только определенной сущности

#c# #domain-driven-design #ddd-repositories

#c# #дизайн, управляемый доменом #ddd-репозитории

Вопрос:

У меня есть один важный вопрос о репозитории и сущности. Должен ли я ограничить репозиторий для создания определенного объекта / совокупного корня (через общие репозитории, такие как BaseRepository)?

На данный момент базовый репозиторий имеет доступ к объекту фабрики базы данных (не DbFactory, а пользовательскому) для извлечения любого POCO (не только связанного с совокупным корнем). Итак, технически я могу создать любую сущность из любого репозитория. Очевидно, что как программист я этого не делаю, но это определенно возможно. Итак, необходимо ли ограничивать репозиторий и разрешать ему создавать определенную сущность? Обратите внимание, что у некоторых объектов также есть вложенные объекты. Итак, если я ограничу репозиторий для создания одного объекта (через BaseRepository), то как создать дочерние объекты?

Комментарии:

1. Вы имеете в виду «создать», как при введении нового объекта / агрегированного корня в системе или регидратации ранее сохраненного объекта? Часть «объект фабрики базы данных для извлечения любого POCO» делает это совершенно неясным.

Ответ №1:

Как предлагает @Jonas в своем ответе, я бы создал один репозиторий для каждого совокупного корня. Они должны скрывать все детали сохранения. Это означает принятие объектов домена в качестве параметров и возврат объектов домена. Обычно сопоставление объекта ORM с объектом домена в репозитории. В качестве побочного эффекта это также заставляет вас задуматься о том, какие данные вам нужны, уменьшая некоторые ужасы, с которыми вы можете столкнуться в DDD, имея дело с объектами, которые имеют отложенные свойства.

Я бы избегал общего шаблона репозитория, как вы говорите в своем исходном сообщении, в DDD вы хотите, чтобы ваш код документировал ваше намерение дизайна, вы не хотите предоставлять код, который позволяет клиентам / абонентам загружать любую сущность из вашей базы данных. Кроме того, большинство ваших сущностей, скорее всего, будут созданы из множества таблиц / ресурсов, что плохо подходит для общего шаблона репозитория.

Комментарии:

1. Я согласен с вами. На самом деле, я уже получил ответ от ben-morris.com /…

Ответ №2:

Я бы счел очевидным наличие репозитория для каждого совокупного корня в вашем ограниченном контексте.

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