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