Có — nhưng gom bằng Facade (một điểm vào cho một quy trình), không phải một class "Manager" chứa tất cả.
ts
class RegistrationFacade {
constructor(
private users: UserService,
private profiles: ProfileService,
private mailer: Mailer,
private audit: AuditLog,
) {}
async register(input: RegisterInput) {
const user = await this.users.create(input)
await this.profiles.createDefault(user.id)
await this.mailer.sendWelcome(user.email)
await this.audit.record('user.registered', user.id)
return user
}
}Controller chỉ còn: validate request → gọi register → map response. Quy trình đăng ký nằm một chỗ, test được mà không cần dựng HTTP.
Ranh giới cần giữ:
- Facade điều phối, không chứa logic nghiệp vụ chi tiết. Nếu nó bắt đầu tính toán giá, kiểm tra quyền, dựng truy vấn thì nó đang biến thành god object.
- Facade không được chặn truy cập trực tiếp vào service bên dưới; chỗ nào chỉ cần một service thì cứ gọi thẳng.
- Bước nào không nhất thiết phải xong ngay (gửi mail, ghi audit) nên tách sang xử lý nền, để lỗi mail không làm hỏng việc đăng ký.