← Назад к вопросам

Где находится адаптер в гексагональной архитектуре?

2.3 Middle🔥 71 комментариев
#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Адаптеры в гексагональной архитектуре

Адаптер — один из ключевых элементов гексагональной (портово-адаптерной) архитектуры. Это паттерн, разработанный Алистером Кокберном, который изолирует ядро приложения от внешних систем.

Расположение адаптеров

Адаптеры находятся на границе между ядром приложения (бизнес-логика) и внешним миром (БД, API, UI, файловая система). Они образуют "шестиугольник", где каждая сторона может содержать адаптеры для взаимодействия с внешними системами.

Типы адаптеров

Primary Adapters (входящие)

Отвечают за получение входных данных:

  • HTTP контроллеры — обработка REST API запросов
  • Telegram боты — обработка событий от Telegram
  • WebSocket обработчики — для real-time коммуникации
  • CLI интерфейсы — для консольных команд

Secondary Adapters (исходящие)

Отвечают за отправку данных наружу:

  • БД адаптеры — работа с PostgreSQL, Redis, MongoDB
  • HTTP клиенты — вызовы внешних API
  • Message brokers — отправка событий в RabbitMQ, Kafka
  • Файловая система — сохранение файлов

Практический пример

# Ядро приложения - бизнес-логика (чистая от деталей реализации)
class QuestionService:
    def __init__(self, repository: QuestionRepository):
        self.repository = repository
    
    def get_question(self, question_id: str) -> Question:
        return self.repository.find_by_id(question_id)

# Primary Adapter - HTTP контроллер
@router.get("/questions/{id}")
def get_question(id: str, service: QuestionService = Depends()):
    question = service.get_question(id)
    return QuestionResponse(**question.dict())

# Secondary Adapter - БД
class PostgresQuestionRepository(QuestionRepository):
    def find_by_id(self, question_id: str) -> Question:
        result = db.query(QuestionModel).filter_by(id=question_id).first()
        return Question(**result.dict())

# Альтернативный Secondary Adapter - для тестов
class InMemoryQuestionRepository(QuestionRepository):
    def find_by_id(self, question_id: str) -> Question:
        return self.questions[question_id]

Ключевые принципы

Инверсия зависимостей: ядро приложения зависит от абстракций (интерфейсов), а адаптеры реализуют эти интерфейсы. Это позволяет легко заменять реализации без изменения ядра.

Изоляция: бизнес-логика остаётся независимой от способа взаимодействия с внешним миром — можно переключаться между БД, API провайдерами без переписывания сервисов.

Тестируемость: благодаря абстракциям легко подмены реальные адаптеры на mock-версии для unit-тестов.

Архитектурная диаграмма

Ядро (Domain Services) окружено слоем портов (интерфейсов), за которыми находятся адаптеры, взаимодействующие с внешними системами. При добавлении нового источника данных или способа взаимодействия — просто добавляешь новый адаптер, не трогая ядро.

Эта архитектура обеспечивает максимальную гибкость и maintainability приложения.

Где находится адаптер в гексагональной архитектуре? | PrepBro