Недавно мы с командой перешли на подход
package-by-feature. Теперь мы структурируем доменные директории по такому принципу:
Domain:
feature1:
- Presentation (controllers, commands)
- Application (use cases)
- Domain (entities, domain models, contacts, services, exceptions etc)
- Infrastructure (repositories, in-memory adapters, etc.)
feature2:
...
В целом проект стал смотреться намного лучше, удобней и все довольны, однако возник такой вопрос - как фичи должны взаимодействовать друг с другом в рамках одного домена? Может ли одна фича вызвать напрямую репозиторий или сервис доменного слоя другой фичи.
Например, простой пример - у нас есть домен
Лента новостей, в ленте есть две фичи -
Пост и
Комментарий. При сохранении комментария к посту мы хотим проверить что
Пост существует и соблюдаются некие условия, для чего нам необходимо получить сущность поста. Можно ли из
Комментария обратиться напрямую к репозиторию из
Поста? Кажется что нет, ведь в таком случае размываются границы между фичами и мы возвращаемся к big-ball-of-mud.
Какие варианты мы себе представляем
1) Запретить любые вызовы напрямую. В корне каждой фичи разместить интерфейсы, которыми могут пользоваться другие фичи.
- Это ведёт к нагромождению кода, как нам кажется.
2) Использовать некое ядро внутри домена, общее для всех фич, которое будет содержать сущности и репозитории, общие для всех фич.
- Трудно обозначить границы общего, слишком большая вероятность того, что весь код переселится в общее ядро.
3) Дублирование методов репозитория внутри каждой фичи.
- Дублирование.
Подскажите, какие варианты, возможно, мы упускаем? Какой подход вы бы выбрали и почему?