FluentValidation:更優雅的驗證方法

在軟件開發中,數據驗證是很重要的一環。我們需要保證我們的應用程序接收的數據是有效、正確的,因此我們需要一套強大的驗證庫。在這篇文章中,我們將詳細介紹 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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
IKVBI的頭像IKVBI
上一篇 2025-04-23 18:08
下一篇 2025-04-23 18:08

相關推薦

  • ArcGIS更改標註位置為中心的方法

    本篇文章將從多個方面詳細闡述如何在ArcGIS中更改標註位置為中心。讓我們一步步來看。 一、禁止標註智能調整 在ArcMap中設置標註智能調整可以自動將標註位置調整到最佳顯示位置。…

    編程 2025-04-29
  • 解決.net 6.0運行閃退的方法

    如果你正在使用.net 6.0開發應用程序,可能會遇到程序閃退的情況。這篇文章將從多個方面為你解決這個問題。 一、代碼問題 代碼問題是導致.net 6.0程序閃退的主要原因之一。首…

    編程 2025-04-29
  • Python中init方法的作用及使用方法

    Python中的init方法是一個類的構造函數,在創建對象時被調用。在本篇文章中,我們將從多個方面詳細討論init方法的作用,使用方法以及注意點。 一、定義init方法 在Pyth…

    編程 2025-04-29
  • Python創建分配內存的方法

    在python中,我們常常需要創建並分配內存來存儲數據。不同的類型和數據結構可能需要不同的方法來分配內存。本文將從多個方面介紹Python創建分配內存的方法,包括列表、元組、字典、…

    編程 2025-04-29
  • 使用Vue實現前端AES加密並輸出為十六進制的方法

    在前端開發中,數據傳輸的安全性問題十分重要,其中一種保護數據安全的方式是加密。本文將會介紹如何使用Vue框架實現前端AES加密並將加密結果輸出為十六進制。 一、AES加密介紹 AE…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • 用不同的方法求素數

    素數是指只能被1和自身整除的正整數,如2、3、5、7、11、13等。素數在密碼學、計算機科學、數學、物理等領域都有着廣泛的應用。本文將介紹幾種常見的求素數的方法,包括暴力枚舉法、埃…

    編程 2025-04-29
  • Python學習筆記:去除字符串最後一個字符的方法

    本文將從多個方面詳細闡述如何通過Python去除字符串最後一個字符,包括使用切片、pop()、刪除、替換等方法來實現。 一、字符串切片 在Python中,可以通過字符串切片的方式來…

    編程 2025-04-29
  • 用法介紹Python集合update方法

    Python集合(set)update()方法是Python的一種集合操作方法,用於將多個集合合併為一個集合。本篇文章將從以下幾個方面進行詳細闡述: 一、參數的含義和用法 Pyth…

    編程 2025-04-29
  • Vb運行程序的三種方法

    VB是一種非常實用的編程工具,它可以被用於開發各種不同的應用程序,從簡單的計算器到更複雜的商業軟件。在VB中,有許多不同的方法可以運行程序,包括編譯器、發布程序以及命令行。在本文中…

    編程 2025-04-29

發表回復

登錄後才能評論