DDD, тяжелые запросы для построения сущности

Обсуждаем, как правильно строить приложения
Ответить
Alert230
Сообщения: 56
Зарегистрирован: 2018.03.09, 13:34

DDD, тяжелые запросы для построения сущности

Сообщение Alert230 »

Всем добра!
Развиваюсь в сторону DDD, есть интересный для меня вопрос.
Ситуация(для примера):
- есть доменная сущность House
- в этой сущности есть метод getSummCount, результат метода - число, но формируется оно очень тяжеловесным SQL запросом.

Сейчас, на этапе разработки, я запилил SQL-запрос прямо в доменную сущность. Плюсы - работает. Минусы - не тестируется, инфраструктурная логика в домене. Понимание того, что в домене не должно быть репозитарного кода - имеется.

Итак.
Первая идея - реализация в сервисе с учётом переданного репозитория, например HouseService->findById($id), где ищем по id, считаем summCount, и отдаём в конструктор return new House (...., $summCount). Минусы - запрос тяжелый, и нужен совсем не везде.
Вторая идея - в нужном контроллере, после получения сущности, делать метод HouseService->calcSummCount, который будет делать set для нашего экземпляра в переменную House->summCount

Как мне сделать эту цифру "по необходимости", к чему стремиться?
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: DDD, тяжелые запросы для построения сущности

Сообщение anton_z »

Alert230 писал(а): 2019.01.23, 06:38
Минусы - не тестируется
А почему не тестируется? Фикстуры или haveInDatabase() (codeception в помошь).


А в остальном (без этого метода) сущность изолирована от базы (исп. DataMapper)? Если нет я бы оставил так так есть и тестировал бы вместе с базой.
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: DDD, тяжелые запросы для построения сущности

Сообщение chungachguk »

Думаю вторая идея в самый раз. Добавил в сущность дполнительное поле sum. По мере необходимости через сервис расчитал сумму и сохранил в сущности. И дальше использовал только это поле.
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: DDD, тяжелые запросы для построения сущности

Сообщение S c »

Вариант - в сервисе запилить метод, который будет считать и возвращать это значение (либо вообще отдельный сервис с единственной функцией - HouseSummCountCalcService, что то в этом роде). Если запрос действительно тяжелый и редко нужен - не нужно в findById его вычислять. Ну и появляется еще дополнительный вопрос - действительно ли место в вашей доменной сущности методу getSummCount(). Я для таких специфических вещей люблю сервисы использовать.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: DDD, тяжелые запросы для построения сущности

Сообщение samdark »

Я бы тоже посмотрел в сторону отдельного сервиса (и репозитория для него). Особенно если метод специфичен для, например, отчёта.
Alert230
Сообщения: 56
Зарегистрирован: 2018.03.09, 13:34

Re: DDD, тяжелые запросы для построения сущности

Сообщение Alert230 »

samdark писал(а): 2019.01.23, 19:30 Я бы тоже посмотрел в сторону отдельного сервиса (и репозитория для него). Особенно если метод специфичен для, например, отчёта.
идея логична и понятна.
У меня вытекающий абстрактный вопрос. А есть какое то ограничение на передачу в домен напрямую репозитория/сервиса? Чтобы получать данные по декоратору. Ест-но исходя из философии DDD. Или все сущности нужно формировать внутри action ?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: DDD, тяжелые запросы для построения сущности

Сообщение samdark »

По-хорошему, должна быть граница. На этой границе всё специфичное для хранилища должно очищаться и становиться доменными DTO/Entity и наоборот.
Ответить