Можно ли правильно разместить интерфейс репозитория во внешнем слое при использовании принципов чистой архитектуры?

Каковы различия между размещением интерфейса репозитория в слое domain рядом с сущностью и размещением его в выходном порте?
  • 26 июля 2024 г. 13:22
Ответы на вопрос 2
В принципах чистой архитектуры предполагается, что интерфейс репозитория должен быть размещен во внешнем слое и выступать в качестве выходного порта, отделяющего внутреннюю бизнес-логику от внешних зависимостей.

Размещение интерфейса репозитория в слое domain рядом с сущностью нарушает принципы чистой архитектуры, так как это создает прямую связь между слоем предметной области и слоем доступа к данным. Это может привести к утечке абстракций и усложнению изменения внешних зависимостей.

Размещение интерфейса репозитория в выходном порте позволяет сделать слой предметной области независимым от конкретных реализаций доступа к данным. Это позволяет легко заменять реализации репозитория без изменения кода в слое предметной области и обеспечивает легкость в тестировании.
По идее, репозиторий - это абстракция над хранилищем твоих сущностей, он должен быть простой прослойкой для запросов в БД. Он должен быть в доменном слое, чтобы ты мог получать доступ к сущностям и выполнять доменные операции, например, заказ товара - нужен репозиторий, чтобы обновить сущность заказа. 

В контроллеры его могут класть для простоты. Например, есть GET запрос - не зачем тебе создавать отдельные юз. кейсы и т.д. - просто вызови нужный метод у интерфейса репозитория.

Если размещать интерфейс репозитория в прикладном слое, то тут 2 варианта:
1. У тебя богатые сущности, которые могут выполнять все действия без необходимости доп. запросов. Это похоже на DDD с их агрегатами.
2. Все смешалось в кучу и доменка вызывает прикладной слой

Скорее всего, идея такого проекта следующая - доменный слой имеется только сущности и все операции не требуют других зависимостей, а прикладной слой уже кое-как говорит с внешним миром и реализует бизнес операции.
Похожие вопросы