Где находится адаптер в гексагональной архитектуре?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Адаптеры в гексагональной архитектуре
Адаптер — один из ключевых элементов гексагональной (портово-адаптерной) архитектуры. Это паттерн, разработанный Алистером Кокберном, который изолирует ядро приложения от внешних систем.
Расположение адаптеров
Адаптеры находятся на границе между ядром приложения (бизнес-логика) и внешним миром (БД, 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 приложения.