Изучаю гексогональную архитектуру, пытаюсь разобраться в частности с persistenсe layer и его использование с CQRS и DDD
При изучении нескольких демо примеров увидел несколько подходов в реализации persistenсe слоя
1. В домене хранить интерфейс репозитория, в инфраструктурном слое хранить реализацию репозитория(адаптер над хранилищем по Гекc. Архитектуре).
2. Интерфейс и реализацию репозитория хранить в домене, а репозиторий использует адаптер для query builder.
https://github.com/hgraca/explicit-architecture-php/tree/master/src/Infrastructure/Persistence/Doctrine 3. Подход Domain model -> Repository -> Persistence model
https://github.com/Sairyss/domain-driven-hexagon#persistence-models В подходах с query builder-ом и persistence model слои слишком толстые получатся.
Например во 2 подходе при смене с доктрины на active record, когда адаптер изначально просто дублировал апи доктрины, и под active record надо будет написать много кода.
Хотелось бы разобраться со всеми плюсами и минусами подходов реализации persistence layer и нюансы при использовании разных хранилищ в проекте SQL, NOSQL и т.п.
Есть ли еще какие-то варианты реализации persistenсe слоя?
Гуглил на эту тему, ничего годного пока не нашел.
Потом меня интересует в каких случаях реализовывать Query запросы в CQRS с использованием PDO, или с методом find/findAll с criteria-ми/filter-ами для фильтрации в репозитории или использовать адаптер query builder-а или как лучше их создавать?
В дополнение ) интересует можно ли в приложении использовать интерфейсы PSR, вместо создания адаптеров под PSR пакеты?