Проблема, с которой я постоянно сталкиваюсь, заключается в том, как работать с вычисленными значениями, управляемыми логикой домена, и при этом эффективно работать с хранилищем данных.
Пример:
Я возвращаю список Продуктов из своего хранилища через сервис. Этот список ограничен информацией о нумерации страниц из запроса DTO, отправленного клиентом. Кроме того, DTO указывает параметр сортировки (дружественное для клиента перечисление).
В простом сценарии все работает отлично: служба отправляет выражения подкачки и сортировки в репозиторий, а репо выдает эффективный запрос в БД.
Однако все это ломается, когда мне нужно отсортировать значения, сгенерированные в памяти из моей доменной модели. Например, класс Product имеет метод IsExpired (), который возвращает логическое значение на основе бизнес-логики. Теперь я не могу сортировать и пейджировать на уровне репо - все это было бы сделано в памяти (неэффективно), и мой сервис должен был бы знать тонкости, когда выдавать эти параметры в репо, а когда выполнять сортировку / разбиение по страницам. сам.
Единственный шаблон, который, по-видимому, имеет смысл для меня, - это сохранить состояние объекта в БД (сделать IsExpired () доступным только для чтения полем и обновить его с помощью логики домена перед сохранением). Если я разделю эту логику на отдельный репозиторий «read model / dto» и «report», я сделаю свою модель более анемичной, чем хотелось бы.
Кстати, каждый пример, который я видел там для таких вычислений, действительно, кажется, опирается на обработку в памяти и приглушает тот факт, что в долгосрочной перспективе он гораздо менее эффективен. Может быть, я преждевременно оптимизирую, но это не подходит мне.
Я хотел бы услышать, как другие справились с этим, так как я уверен, что это обычное дело почти на проекте с участием DDD.
Я думаю, я бы задал вопрос, что такое бизнес-логика, которая определяет, является ли isExpired истинным или нет. Может ли эта логика быть выполнена запросом при наличии модели данных? Если да, можете ли вы сделать свой репозиторий достаточно интеллектуальным, чтобы использовать логику «isExpired», когда вы определенным образом запрашиваете его для Продуктов? Если нет, возможно, вам нужно пересмотреть свою модель данных.
DDD не означает, что ваши репозитории должны быть глупыми - это просто означает, что ваш домен должен знать, как общаться с вашими репозиториями.
источник