[Input Adapters в DDD: как внешний мир общается с приложением]
Привет! Сегодня про Input Adapters — элемент гексагональной архитектуры (и DDD), который отвечает за преобразование внешних запросов (HTTP, CLI, события) в команды приложения.
1. Что это такое?
Input Adapter — это не только про REST-эндпоинты, а это единая точка входа для всех внешних взаимодействий.
Он:
- Парсит входящие данные (JSON, protobuf, CLI-аргументы).
- Валидирует их (например, через Pydantic).
- Вызывает Use Case (Command или Query).
- Не содержит бизнес-логики (это задача домена).
Примеры Input Adapters:
- REST API (FastAPI, Django View).
- CLI-команды (Click, Typer).
- Обработчики событий (Kafka Consumer).
- WebSocket-хэндлеры.
Ниже пример REST API
2. Где находятся Input Adapters в структуре проекта?
Они относятся к presentation-слою, но могут выноситься в отдельный модуль для сложных сценариев:
3. Почему Input Adapters — это важно?
- Изоляция домена
Домен не знает, откуда пришёл запрос (HTTP, Kafka или CLI).
- Гибкость
Можно добавить новый адаптер (например, gRPC), не меняя Use Case.
- Тестируемость
Адаптеры легко тестировать в изоляции (например, мокая Use Case).
- Согласованность
Все входные данные проходят одинаковую валидацию перед передачей в Use Case.
4. Типичные ошибки
❌ Бизнес-логика в адаптерах
Код вида if user.role == "admin" должен быть в домене, а не в REST-хэндлере.
❌ Прямая работа с репозиториями
Адаптер вызывает только Use Case, не лезет в БД напрямую.
5. Вывод
Input Adapters — это "входные ворота" приложения, которые:
🔹 Преобразуют внешние запросы в команды/запросы.
🔹 Не содержат логики (только парсинг и валидацию).
🔹 Делают систему гибкой к изменениям протоколов.
#DDD #CleanArchitecture #InputAdapters #Python
Привет! Сегодня про Input Adapters — элемент гексагональной архитектуры (и DDD), который отвечает за преобразование внешних запросов (HTTP, CLI, события) в команды приложения.
1. Что это такое?
Input Adapter — это не только про REST-эндпоинты, а это единая точка входа для всех внешних взаимодействий.
Он:
- Парсит входящие данные (JSON, protobuf, CLI-аргументы).
- Валидирует их (например, через Pydantic).
- Вызывает Use Case (Command или Query).
- Не содержит бизнес-логики (это задача домена).
Примеры Input Adapters:
- REST API (FastAPI, Django View).
- CLI-команды (Click, Typer).
- Обработчики событий (Kafka Consumer).
- WebSocket-хэндлеры.
Ниже пример REST API
# presentation/api/rest/order_adapters.py
from fastapi import APIRouter, Depends
from application.commands import CreateOrderCommand
from presentation.schemas import OrderCreateRequest
router = APIRouter()
@router.post("/orders")
async def create_order(
request: OrderCreateRequest, # Pydantic-модель для валидации
command: CreateOrderCommand = Depends(), # Use Case
):
# Преобразуем запрос в DTO (без бизнес-логики!)
order_id = command.execute(
user_id=request.user_id,
items=[item.to_domain() for item in request.items]
)
return {"order_id": order_id}
2. Где находятся Input Adapters в структуре проекта?
Они относятся к presentation-слою, но могут выноситься в отдельный модуль для сложных сценариев:
src/
├── domain/
├── application/
├── infrastructure/
└── presentation/ # Input Adapters
├── api/ # HTTP-адаптеры
│ ├── rest/ # REST (FastAPI)
│ └── graphql/ # GraphQL
├── cli/ # CLI-адаптеры (Click)
└── events/ # Обработчики событий (Kafka, RabbitMQ)
3. Почему Input Adapters — это важно?
- Изоляция домена
Домен не знает, откуда пришёл запрос (HTTP, Kafka или CLI).
- Гибкость
Можно добавить новый адаптер (например, gRPC), не меняя Use Case.
- Тестируемость
Адаптеры легко тестировать в изоляции (например, мокая Use Case).
- Согласованность
Все входные данные проходят одинаковую валидацию перед передачей в Use Case.
4. Типичные ошибки
❌ Бизнес-логика в адаптерах
Код вида if user.role == "admin" должен быть в домене, а не в REST-хэндлере.
❌ Прямая работа с репозиториями
Адаптер вызывает только Use Case, не лезет в БД напрямую.
5. Вывод
Input Adapters — это "входные ворота" приложения, которые:
🔹 Преобразуют внешние запросы в команды/запросы.
🔹 Не содержат логики (только парсинг и валидацию).
🔹 Делают систему гибкой к изменениям протоколов.
#DDD #CleanArchitecture #InputAdapters #Python