Здравствуйте!
Делаю программу, стараюсь применять 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, который не имеет отношения к бизнес-логике.
Это очень не хорошо.
Как бы сделать так, чтобы работа с временной таблицей "ушла" на более низкий уровень — на уровень Репозиториев?