Controller là gì?

Controller được dùng để định nghĩa và nhóm một tập hợp các actions. Một action (hay action method) là method trên controller dùng để xử lý requests. Controllers nhóm các actions tương tự lại với nhau, cho phép áp dụng các quy tắc chung như routing, cachingauthorization cho toàn bộ nhóm. Requests được map đến actions thông qua routing. Controllers được khởi tạo và hủy trên mỗi request.

Quy ước đặt tên Controller

Theo quy ước, controller classes:
  • Nằm trong thư mục Controllers ở root của project
  • Kế thừa từ Microsoft.AspNetCore.Mvc.Controller
Một class được coi là controller khi thỏa ít nhất một trong các điều kiện:

Controller và mô hình MVC

Trong mô hình MVC, controller chịu trách nhiệm:
  1. Xử lý request ban đầu — đảm bảo request data hợp lệ
  2. Instantiate model — tạo đối tượng model
  3. Chọn kết quả trả về — View hoặc API response
Lưu ý: Controller là một abstraction ở mức UI. Trong ứng dụng được thiết kế tốt, controller không trực tiếp thực hiện data access hay business logic. Thay vào đó, controller delegates đến các services xử lý các trách nhiệm này.

Dependency Injection trong Controller

Controllers nên tuân theo Explicit Dependencies Principle.

Constructor Injection

Action Injection


Action Methods

Định nghĩa Action

Tất cả public methods trên controller đều là actions, trừ method có attribute [NonAction].

Action Parameters và Model Binding

Parameters trên actions được bind từ request data và validated bằng model binding. Model validation xảy ra cho tất cả model-bound parameters. Property ModelState.IsValid cho biết binding và validation có thành công không.

Action Results

Actions có thể trả về bất kỳ type nào, nhưng thường trả về IActionResult (hoặc Task<IActionResult> cho async methods).

Controller Helper Methods

Controllers kế thừa từ Controller có quyền truy cập 3 nhóm helper methods:

1. Trả về Response Body rỗng

Không có Content-Type HTTP header vì response body không có nội dung.

HTTP Status Code

Redirect


2. Trả về Response Body có predefined Content-Type

View

Formatted Response


3. Content Negotiation

Content Negotiation xảy ra khi action trả về ObjectResult hoặc non-IActionResult. Các method này tự động chọn format (JSON/XML) dựa trên Accept header của client.

Cross-Cutting Concerns

Cross-cutting concerns là các phần workflow được chia sẻ giữa nhiều parts của ứng dụng, như authentication, logging, error handling.

Ví dụ: Cross-cutting concerns thường gặp


Tài liệu tham khảo