Ответ
Контроллер в чистой архитектуре — это слой, отвечающий за обработку входящих HTTP-запросов и преобразование их в вызовы Use Case. Он не содержит бизнес-логики, а лишь:
- Валидирует входные данные
- Конвертирует DTO в доменные модели
- Вызывает соответствующий Use Case
- Преобразует результат в HTTP-ответ
Пример на Go:
type UserController struct {
createUser usecase.CreateUser
}
func (c *UserController) CreateUser(w http.ResponseWriter, r *http.Request) {
var req CreateUserRequest
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
http.Error(w, "invalid request", http.StatusBadRequest)
return
}
user, err := c.createUser.Execute(r.Context(), req.ToDomain())
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
json.NewEncoder(w).Encode(UserResponseFromDomain(user))
}
Контроллер зависит от Use Case, но не наоборот, что сохраняет направление зависимостей наружу к фреймворкам.