csharp-validationlisted
Install: claude install-skill CloudyWing/ai-dotfiles
# C# 輸入驗證規範
## 驗證層級(Crucial)
輸入驗證分為三個層級,各有職責,不可混淆:
| 層級 | ��責 | 負責位置 | 範例 |
| --- | --- | --- | --- |
| 格式驗證 | 資料型別、必填、長度、格式 | Model Binding / Request Model | 必填欄位、Email 格式、字串長度 |
| 商業規則驗證 | 需要查詢資料庫或外部狀態的規則 | Service Layer | 帳號是否重複、庫存是否足夠 |
| 不變式保護 | Domain Model 自身的完整性約束 | Domain Model 建構函式 | 金額不可為負、起始日不可晚於結束日 |
- **格式驗證**在 Controller / Endpoint 層自動觸發,驗證失敗直接回傳 400,不進入 Service。
- **商業規則驗證**在 Service Layer 處理,透過例外或 Result Pattern 回報(依專案慣例)。
- **不變式保護**在 Domain Model 的建構函式或 setter 中以 Guard Clause 實作。
## 驗證框架選型
### DataAnnotations(預設選擇)
適用於大多數格式驗證場景。ASP.NET Core Model Binding 原生支援,零設定即可使用。
```csharp
public class CreateOrderRequest {
[Required(ErrorMessage = "客戶名稱為必填。")]
[StringLength(100, ErrorMessage = "客戶名稱不可超過 100 字。")]
public required string CustomerName { get; set; }
[Range(1, 10000, ErrorMessage = "數量必須介於 1 到 10000 之間。")]
public required int Quantity { get; set; }
[EmailAddress(ErrorMessage = "Email 格式不正確。")]
public string? ContactEmail { get; set; }
}
```
### FluentValidation(複雜或跨屬性驗證)
適用於需要跨屬性條件判斷、依情境切換規則、或需要注入服務的驗證場景。
```csharp
public class CreateOrderRequestValidator : AbstractValidator<CreateOrderRequest> {
public CreateOrderRequestValidator() {
RuleFor(x => x.CustomerName)
.NotEmpty().WithMessage("客戶名稱為必填。")
.MaximumLength(100).WithMessage("客戶名稱不可超過 100 字。");
RuleFor(x => x.Quantity)
.InclusiveBetween(1, 10000).WithMessage("數量必須介於 1 到 10000 之間。");
RuleFor(x => x