在軟件開發中,數據驗證是很重要的一環。我們需要保證我們的應用程序接收的數據是有效、正確的,因此我們需要一套強大的驗證庫。在這篇文章中,我們將詳細介紹 FluentValidation,這是一個非常流行的驗證庫。
一、簡介
FluentValidation 是一個開源的 .NET 核心庫,可以幫助我們運用一種更加優雅的方式來驗證對象、模型、集合等。它提供了一種聲明式的驗證方法,使我們能夠輕鬆地編寫出易於維護的驗證規則。
FluentValidation 的特點在於易於使用,同時非常靈活。它支持複雜的驗證規則,並且可以輕鬆地定製錯誤信息。它還可以輕鬆地與 ASP.NET Core 集成,因此我們可以在驗證期間對 HTTP 請求進行驗證。
二、安裝與使用
首先,我們需要安裝 FluentValidation 及其相關擴展包:
Install-Package FluentValidation
Install-Package FluentValidation.AspNetCore
我們可以使用 NuGet 包管理器,或者使用 Package Manager Console 來進行安裝。
在使用 FluentValidation 前,我們需要創建一個驗證器類,如下所示:
public class PersonValidator : AbstractValidator<Person>
{
public PersonValidator()
{
RuleFor(person => person.FirstName).NotEmpty();
RuleFor(person => person.LastName).NotEmpty();
RuleFor(person => person.Email).EmailAddress();
}
}
在這個示例中,我們創建了一個名為 PersonValidator 的驗證器類,它繼承自 AbstractValidator 類。PersonValidator 類的泛型參數指定了要驗證的類型,這裡是 Person 類型。
在構造函數中,我們定義了三個驗證規則。這些規則說明了一個人的名字和電子郵件地址不能為空,並且必須是有效的電子郵件地址。
一旦我們定義了驗證器,我們就可以將其用於驗證 Person 對象,如下所示:
var person = new Person();
var validator = new PersonValidator();
ValidationResult result = validator.Validate(person);
if(result.IsValid)
{
// 對象驗證成功
}
else
{
// 對象驗證失敗
}
在這個例子中,我們首先創建了一個 Person 對象和一個 PersonValidator 實例。然後,我們將 Person 對象傳遞給驗證器的 Validate 方法進行驗證。如果驗證通過,則 IsValid 屬性將返回 true,否則返回 false。
三、驗證規則
FluentValidation 提供了很多內置的驗證規則,同時也支持自定義驗證規則。
1. 內置驗證規則
下表列出了 FluentValidation 內置的一些常見驗證規則:
驗證規則 | 說明 |
---|---|
NotNull | 驗證對象不為空 |
NotEmpty | 驗證字符串不為空 |
EmailAddress | 驗證字符串是有效的電子郵件地址 |
Equal | 驗證對象是否相等 |
GreaterThan | 驗證對象是否大於指定的值 |
LessThan | 驗證對象是否小於指定的值 |
InclusiveBetween | 驗證對象是否在指定範圍內 |
ExclusiveBetween | 驗證對象是否在指定範圍外 |
Matches | 驗證字符串是否匹配指定的正則表達式 |
Length | 驗證字符串的長度是否在指定範圍內 |
這些規則非常基礎,它們可以滿足我們的大部分需求。如果需要自定義驗證規則,我們可以使用自定義驗證器。
2. 自定義驗證器
自定義驗證器可以通過繼承自 AbstractValidator 來創建。定義自定義驗證器的方式與定義內置驗證器的方式非常相似。例如,我們可以創建一個驗證器來驗證密碼是強密碼:
public class PasswordValidator : AbstractValidator<string>
{
public PasswordValidator()
{
RuleFor(password => password).Must(password =>
{
var lower = false;
var upper = false;
var digit = false;
var special = false;
foreach (var character in password)
{
if (char.IsLower(character))
{
lower = true;
}
else if (char.IsUpper(character))
{
upper = true;
}
else if (char.IsDigit(character))
{
digit = true;
}
else if (char.IsSymbol(character) || char.IsPunctuation(character))
{
special = true;
}
}
return lower && upper && digit && special;
}).WithMessage("密碼必須包含至少一個小寫字母、一個大寫字母、一個數字和一個特殊字符。");
}
}
在這個示例中,我們創建了一個名為 PasswordValidator 的驗證器類,它繼承自 AbstractValidator。在構造函數中,我們編寫了一個驗證規則。我們首先將密碼字符串轉換為 char 數組,並遍歷整個數組。我們使用 char.IsLower、char.IsUpper、char.IsDigit 和 char.IsSymbol 方法來獲取字符的類型,並將其保存在不同的布爾變量中。
然後,我們返回一個邏輯值,該值指示密碼字符串是否包含小寫字母、大寫字母、數字和特殊字符。如果該方法返回 false,則驗證失敗,並顯示指定的錯誤消息。
四、自定義錯誤消息
默認情況下,FluentValidation 會為每個驗證規則生成一個默認的錯誤消息。如果我們需要自定義錯誤消息,可以使用 WithMessage 方法。這個方法需要一個字符串參數,這個參數就是我們要顯示的錯誤消息。
例如,我們可以自定義 PersonValidator 驗證器的錯誤消息:
public class PersonValidator : AbstractValidator<Person>
{
public PersonValidator()
{
RuleFor(person => person.FirstName).NotEmpty().WithMessage("FirstName 不能為空");
RuleFor(person => person.LastName).NotEmpty().WithMessage("LastName 不能為空");
RuleFor(person => person.Email).EmailAddress().WithMessage("郵件地址不合法");
}
}
在這個示例中,我們使用 WithMessage 方法來自定義每個驗證規則的錯誤消息。這些錯誤消息將用於驗證 Person 對象時出現錯誤時的提示。
五、複雜對象驗證
在某些情況下,我們需要驗證更複雜的對象,如嵌套對象、集合等。FluentValidation 提供了一種簡單而靈活的方式來實現這一點。
考慮以下場景。我們需要驗證一個訂單對象,該對象包含多個產品。我們需要驗證每個產品的名稱和價格是否非空,並且訂單總價是否正確。
public class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
}
public class Order
{
public List<Product> Products { get; set; }
}
public class OrderValidator : AbstractValidator<Order>
{
public OrderValidator()
{
RuleForEach(order => order.Products).SetValidator(new ProductValidator());
RuleFor(order => order.Products.Sum(p => p.Price))
.Equal(order => order.TotalPrice).WithMessage("訂單總價錯誤");
}
}
public class ProductValidator : AbstractValidator<Product>
{
public ProductValidator()
{
RuleFor(product => product.Name).NotEmpty();
RuleFor(product => product.Price).GreaterThan(0);
}
}
在這個示例中,我們首先定義了一個 Product 類和一個 Order 類。Product 類表示一個產品,包含名稱和價格屬性。Order 類表示一個訂單,包含一個產品列表。我們還定義了一個 OrderValidator 類,它繼承自 AbstractValidator<Order>。在構造函數中,我們使用 RuleForEach 方法來驗證訂單中的每個產品。我們將 ProductValidator 的實例傳遞給 SetValidator 方法,這將驗證 Order 對象中的每個產品。
在 ProductValidator 類中,我們定義了兩個驗證規則。一個是確認產品名稱非空,另一個是確認價格大於零。
最後,我們在 OrderValidator 中定義了一個驗證規則,該規則使用 Equals 方法驗證訂單總價是否正確。如果驗證失敗,則顯示指定的錯誤消息。
總結
在本文中,我們詳細介紹了 FluentValidation 庫,一種更加優雅的驗證方式。我們了解了如何創建驗證器、編寫驗證規則、自定義錯誤消息和驗證複雜的對象。通過這篇文章,希望能夠幫助讀者更好地理解 FluentValidation 的使用方法,以及它為我們帶來的便利。
原創文章,作者:IKVBI,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/371836.html