DDD: фильтр по временной таблице в Репозиториях
От: zelenprog  
Дата: 10.06.24 08:06
Оценка:
Здравствуйте!

Делаю программу, стараюсь применять DDD и "правильную" архитектуру.

Столкнулся с такой задачей.
В слое "Бизнес-логики" есть сущности: товары (TovarEntity), аналоги (AnalogEntity), упаковка товара (PackEntity).
Сущности AnalogEntity и PackEntity — это как бы "подчиненные" сущности, то есть они относятся к конкретному товару.
Для каждой сущности есть "свой" Репозиторий.

Задача следующая.
Пользователь запрашивает коллекцию-список товаров по определенному фильтру.
После получения из TovarRepository этой коллекции, далее нужно получить коллекцию аналогов и коллекцию упаковок этих товаров.
То есть нужно сделать что-то типа следующего:

TovarList = TovarRepository.GetList(FilterCritery);
AnalogList = AnalogRepository.GetListByTovar(TovarList);
PackList = PackRepository.GetListByTovar(TovarList);


Концептуально на этом уровне вроде все просто.
Но как реализовать это — не совсем понятно. Проблема в следующем.
Чтобы получить список аналогов для указанного списка товаров, Репозиторий аналогов должен записать список товаров во временную таблицу БД. А затем выполнить запрос, который фильтрует аналоги по товарам во временной таблице (SELECT * FROM analogs WHERE analog.tovar_id IN (SELECT tovar_id FROM temptable_tovar)).
Чтобы получить список упаковок для указанного списка товаров, Репозиторий упаковок должен сделать то же самое.

Если каждый Репозиторий будет использовать "свою" временную таблицу — это будет неэффективно.
Значит, чтобы дважды не формировать временную таблицу, оба Репозитория (и Репозиторий аналогов и Репозиторий упаковок) должны "знать" про одну и ту же временную таблицу, и понимать что указанный в методе GetListByTovar список товаров уже "лежит" во временной таблице.

Как это сделать не нарушая ответственности слоев?
Конечно можно сделать что-то типа такого:

TovarList = TovarRepository.GetList(FilterCritery);
TovarTempTable = TovarRepository.SaveTempTable(TovarList);
AnalogList = AnalogRepository.GetListByTovar(TovarTempTable);
PackList = PackRepository.GetListByTovar(TovarTempTable);


Однако, здесь получается что бизнес-логика "знает" детали реализации выборки.
В бизнес-логику "внедряется" класс TovarTempTable, который не имеет отношения к бизнес-логике.
Это очень не хорошо.

Как бы сделать так, чтобы работа с временной таблицей "ушла" на более низкий уровень — на уровень Репозиториев?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.