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

Ответ

В гексагональной архитектуре (Ports and Adapters) адаптер — это компонент, который соединяет ядро приложения (бизнес-логику) с внешним миром.

Его главная задача — преобразовывать данные и вызовы между ядром и внешними системами (UI, база данных, сторонние API), изолируя бизнес-логику от деталей их реализации.

Существует два типа адаптеров:

  1. Управляющие (первичные) адаптеры (Driving Adapters): Принимают ввод от пользователя или внешних систем и вызывают ядро приложения. Примеры: контроллеры в веб-фреймворке (REST API), обработчики CLI-команд.

  2. Управляемые (вторичные) адаптеры (Driven Adapters): Вызываются ядром приложения для взаимодействия с внешними сервисами. Примеры: репозиторий для работы с базой данных, клиент для отправки email.

Пример (порт и адаптер для БД на Python):

# 1. Порт (интерфейс), определяемый ядром приложения
class UserRepositoryPort:
    def save(self, user: User) -> None:
        raise NotImplementedError

# 2. Вторичный адаптер, реализующий порт для конкретной БД
class PostgresUserRepositoryAdapter(UserRepositoryPort):
    def __init__(self, db_connection):
        self.db = db_connection

    def save(self, user: User) -> None:
        # Логика преобразования доменной модели в формат БД и сохранения
        print(f"Сохранение пользователя {user.name} в PostgreSQL...")
        query = "INSERT INTO users (id, name) VALUES (%s, %s)"
        self.db.execute(query, (user.id, user.name))

Таким образом, адаптеры позволяют заменять внешние компоненты (например, перейти с PostgreSQL на MongoDB), не затрагивая бизнес-логику ядра. Достаточно лишь реализовать новый адаптер.