Я углубляюсь в Domain Driven Design, и некоторые концепции, с которыми я сталкиваюсь, имеют большой смысл на поверхности, но когда я думаю о них больше, я должен задаться вопросом, действительно ли это хорошая идея.
Например, концепция Агрегатов имеет смысл. Вы создаете небольшие домены собственности, чтобы вам не приходилось иметь дело со всей моделью домена.
Однако, когда я думаю об этом в контексте веб-приложения, мы часто обращаемся к базе данных, чтобы извлечь небольшие подмножества данных. Например, на странице может быть указано только количество заказов с ссылками, по которым можно перейти, чтобы открыть заказ и увидеть его идентификаторы.
Если я понимание Аггрегатов правильно, я обычно использую шаблон репозитория вернуть OrderAggregate , который будет содержать элементы GetAll
, GetByID
, Delete
и Save
. ОК, это звучит хорошо. Но...
Если я вызову GetAll для перечисления всех своих заказов, мне будет казаться, что для этого шаблона потребуется вернуть весь список совокупной информации, полные заказы, строки заказа и т. Д. Когда мне нужно только небольшое подмножество этой информации (только информация заголовка).
Я что-то пропустил? Или какой-то уровень оптимизации вы бы использовали здесь? Я не могу представить, чтобы кто-то выступал за возвращение всей совокупности информации, когда она вам не нужна.
Конечно, можно создать методы в вашем репозитории, как GetOrderHeaders
, но это, кажется, сводит на нет цель использования шаблона, подобного репозиторию, в первую очередь.
Кто-нибудь может уточнить это для меня?
РЕДАКТИРОВАТЬ:
После долгих исследований, я думаю, что разобщенность здесь заключается в том, что чистый шаблон репозитория отличается от того, что большинство людей считает репозиторием существующим.
Фаулер определяет хранилище как хранилище данных, которое использует семантику коллекции и обычно хранится в памяти. Это означает создание целого графа объектов.
Эванс изменяет Репозиторий, чтобы включить Агрегированные Корни, и, таким образом, репозиторий ампутируется, чтобы поддерживать только объекты в Агрегате.
Большинство людей, кажется, считают репозитории прославленными объектами доступа к данным, где вы просто создаете методы для получения любых данных, которые вы хотите. Это не похоже на намерение, описанное в паттернах корпоративной архитектуры приложений Фаулера.
Третьи считают, что хранилище - это простая абстракция, используемая в первую очередь для того, чтобы упростить тестирование и копирование или отделить постоянство от остальной системы.
Я предполагаю, что ответ заключается в том, что это гораздо более сложная концепция, чем я сначала думал.