Существует ли общий шаблон DDD для решения проблемы недогрузки объектов предметной области?

Иногда при работе с приложениями, особенно при попытке следовать правильным шаблонам OOD и DDD, мы получаем классы предметной области, такие как Customer. Затем у нас есть какой-то репозиторий, который будет загружать этот объект, и все красиво и чисто.

Затем приложение усложняется, и мы начинаем оптимизировать производительность. Мы часто оказываемся в ситуациях, когда нам действительно не нужно загружать, скажем, список полных Customer объектов, а может быть только идентификаторы и имена, или небольшое подмножество свойств (например, для отображения в сетке)

Решения, которые я часто видел, включают:

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

  2. Целевое классирование, когда мы создаем такие классы, как CustomerIdName, CustomerInfo, CustomerHeader, содержащие только те свойства, которые нам нужны. Этот подход может создать большое количество классов, но при тщательном создании подклассов это работает. Однако кажется, что это отвлекает от повсеместной концепции доменного языка.

Итак, существует ли какое-то общепринятое соглашение для работы с ними в мире DDD? Я пытался найти это в Google, но не смог найти ничего авторитетного.

Или, может быть, это просто известное ограничение классического подхода DDD, и CQRS или другие подходы были бы лучше в этих сценариях?


person Sebastian K    schedule 05.10.2015    source источник


Ответы (4)


Я думаю, что второй подход - это путь. Мы делаем это в наших проектах, но только для классов DTO только для чтения. Пока вы не используете их для вставки/обновления, я думаю, это нормально.

Существует также то, что ответ, который может вас заинтересовать:

person cool    schedule 05.10.2015
comment
Спасибо, ответ, на который вы ссылаетесь, - это точно та же проблема, с которой я сталкиваюсь. Я должен был бы подумать об этом еще немного, но концепция обхода модели предметной области для определенных запросов приложений является очень интересным решением. - person Sebastian K; 05.10.2015
comment

Это хорошо известное ограничение DDD, и CQRS — очень хороший способ его решить.

CQRS на стороне чтения — это в основном решение № 2 со всеми необходимыми мерами предосторожности, чтобы не путать модели чтения с изменяемыми объектами домена: для них нет репозиториев, классов только для чтения и т. д.

person guillaume31    schedule 06.10.2015
comment
Спасибо, теперь это имеет больше смысла для меня - person Sebastian K; 06.10.2015

Вы изучали Entity Framework? Они имеют несколько уровней отложенной загрузки объектов: сообщение MSDN.

person Nick Klufas    schedule 05.10.2015
comment
Да, мы действительно используем EF (помимо других источников, таких как внешние веб-сервисы). На самом деле мы медленно отходим от ленивой загрузки, так как тогда вы должны помнить, действительно ли объект домена, с которым вы работаете, получен из Entity Framework, и вы не можете делать определенные вещи, такие как сериализация в сеанс, без разрыва соединения EF. - person Sebastian K; 05.10.2015

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

person Stephan Eggermont    schedule 07.10.2015
comment
Хорошо, вот пример, скажем, разработчику нужно изменить способ загрузки клиентов на страницу A - теперь нам нужно применить определенный фильтр. Он обнаруживает, что уже существует метод, который загружает клиента с заданным фильтром, поэтому он использует этот метод. Но тогда при тестировании выясняется, что теперь отображаются удаленные клиенты, хотя страница специально игнорирует удаленных клиентов? Почему? Ну, deleted было логическим свойством, которое не было загружено, и по умолчанию все клиенты отображаются как неудаленные. Это может показаться надуманным примером, но такие ситуации случаются. - person Sebastian K; 07.10.2015
comment
Ленивая загрузка также может быть проблематичной, пара проблем, с которыми я столкнулся, это: Entity Context уже удален, когда представление пытается получить доступ к навигационному свойству с ленивой загрузкой или вызывает свойство с ленивой загрузкой один за другим в большом списке, что приводит к значительному снижению производительности. - person Sebastian K; 07.10.2015
comment
Все это звучит не проблематично, т.е. неработающие реализации. Свойство, которое не загружено, не может быть вызвано, прокси просто должен вернуть ошибку - person Stephan Eggermont; 08.10.2015