Как не нарушать границы компонентов при подходе package-by-feature?

Недавно мы с командой перешли на подход 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) Дублирование методов репозитория внутри каждой фичи. - Дублирование.

Подскажите, какие варианты, возможно, мы упускаем? Какой подход вы бы выбрали и почему?
  • Вопрос задан
  • 271 просмотр
Пригласить эксперта
Ответы на вопрос 1
DollyPapper
@DollyPapper
Ну вызывать на прямую я бы не стал, иначе зачем вы это все делали. Нам от других слоев и пакетов обычно нужны некие данные. Можно передавать DTO между пакетами. Т.е. за получение данных отвечает так же пакет, и другой пакет эти данные использует.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы