Задать вопрос

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

Подскажите, какие варианты, возможно, мы упускаем? Какой подход вы бы выбрали и почему?
  • Вопрос задан
  • 287 просмотров
Подписаться 5 Средний 5 комментариев
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
  • Skillbox
    1C-разработчик
    8 месяцев
    Далее
  • Нетология
    Python-разработчик с нуля
    6 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
DollyPapper
@DollyPapper
Ну вызывать на прямую я бы не стал, иначе зачем вы это все делали. Нам от других слоев и пакетов обычно нужны некие данные. Можно передавать DTO между пакетами. Т.е. за получение данных отвечает так же пакет, и другой пакет эти данные использует.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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