C#封裝FluentValidation,用了之后通篇還是AbstractValidator,真的看不下去了

講故事

前幾天看公司一個新項目使用了FluentValidation,大家都知道FluentValidation是一個非常強大的用于構建強類型驗證規則的 .NET 框架,幫程序員解決了繁瑣的校驗問題,用起來非常爽,但我還是遇到了一件非常不爽的事情,如下代碼所示:

public?class?UserInformationValidator?:?AbstractValidator<UserInformation>{public?UserInformationValidator(){RuleFor(o?=>?o.UserName).Length(2,?20).WithMessage("姓名長度輸入錯誤");RuleFor(o?=>?o.Sex).Must(o=>o=="男"||o=="女").WithMessage("性別輸入錯誤");RuleFor(o?=>?o.Age).ExclusiveBetween(0,?200).WithMessage("年齡輸入錯誤");RuleFor(o?=>?o.Email).EmailAddress().WithMessage("郵箱輸入錯誤");}}static?void?Main(string[]?args){UserInformation?userInformation?=?new?UserInformation();userInformation.UserName?=?"";userInformation.Sex?=?"女";userInformation.Age?=?2200;userInformation.Email?=?"xxxxx";UserInformationValidator?validationRules?=?new?UserInformationValidator();var?result=???validationRules.Validate(userInformation);if?(!result.IsValid){Console.WriteLine(?string.Join(Environment.NewLine,?result.Errors.Select(x?=>?x.ErrorMessage).ToArray()));}}

我們每驗證一個對象,就要新建一個類型的驗證器 ,如上的UserInformationValidator ,雖然這樣寫邏輯上沒有任何問題,但我有潔癖哈,接下來我們試著封裝一下,嘿嘿,用更少的代碼做更多的事情。

安裝

在創建任何驗證器之前,您需要在項目中添加對 FluentValidation.dll 的引用。最簡單的方法是使用 NuGet 包管理器或 dotnet CLI。

模板化代碼封裝探索

將模板化的代碼提取到父類中

仔細看上面的代碼你會發現,我們每新建一個驗證器,就必須要創建一個繼承自AbstractValidator的類,其中T是您希望驗證的類的類型,封裝一個驗證器父類

public?class?CommonVaildator<T>?:?AbstractValidator<T>
{}
增加驗證規則

真正的業務邏輯是寫在UserInformationValidator驗證器里面的,而這塊代碼中只需要拿到RuleFor即可,其它的統一封裝到父類中,對不對,我們按照這個思路代碼,封裝一個長度驗證器規則。首先讓我們看看RuleFor的原型

public?IRuleBuilderInitial<T,?TProperty>?RuleFor<TProperty>(Expression<Func<T,?TProperty>>?expression)

它的參數是一個Func委托,那么Expression是什么呢?Experssion是一種表達式樹!

表達式樹是一種允許將lambda表達式表示為樹狀數據結構而不是可執行邏輯的代碼。

在C#中是Expression來定義的,它是一種語法樹,或者說是一種數據結構。其主要用于存儲需要計算、運算的一種結構,它只提供存儲功能,不進行運算。通常Expression是配合Lambda一起使用,這里就不做過多的解釋了!那么我們就能很輕易的封裝出長度驗證器規則了!

public?void?LengthVaildator(Expression<Func<T,?string>>?expression,?int?min,?int?max,?string?Message){RuleFor(expression).Length(min,?max).WithMessage(Message);}

同理,我們也可以接著封裝謂詞驗證器規則?郵箱驗證器規則等等

public?void?MustVaildator(Expression<Func<T,?string>>?expression?,Func<T,string,?bool>?expression2,?string?Message){RuleFor(expression).Must(expression2).WithMessage(Message);}public?void?EmailAddressVaildator(Expression<Func<T,?string>>?expression,?string?Message){RuleFor(expression).EmailAddress().WithMessage(Message);}
封裝驗證方法

上面我們把驗證器封裝好了,那么將 ?var result= ? validationRules.Validate(userInformation);這種驗證方法封裝一下不是手到擒來,代碼如下

public?static?string?ModelValidator<T>(T?source,?AbstractValidator<T>?sourceValidator)?where?T?:?class{var?results?=?sourceValidator.Validate(source);if?(!results.IsValid)return?string.Join(Environment.NewLine,?results.Errors.Select(x?=>?x.ErrorMessage).ToArray());elsereturn?"";}
測試封裝后的代碼
CommonVaildator<UserInformation>?commonUserInformation?=?new?CommonVaildator<UserInformation>();commonUserInformation.LengthVaildator(o?=>?o.UserName,?2,?30,?"姓名長度輸入錯誤");commonUserInformation.MustVaildator(o?=>?o.Sex,?(user,?_)?=>?user.Sex?=="男"||user.Sex=="女"?,?"性別輸入錯誤");commonUserInformation.ExclusiveBetweenVaildator(o=>o.Age,0,?200,?"年齡輸入錯誤");commonUserInformation.EmailAddressVaildator(o?=>?o.Email,?"郵箱輸入錯誤");string?msg=?VaildatorHelper.ModelValidator(userInformation,?commonUserInformation);Console.WriteLine(msg);

這樣代碼看起來是不是就簡潔多了,我這里就只封裝了四種驗證規則,其它的我就不在此封裝了。

總結

文章來源于工作中的點點滴滴,這也是我的即興封裝,大家要是有更好的封裝代碼,歡迎交流,獨樂樂不如眾樂樂,本篇就說到這里啦,希望對您有幫助。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286370.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286370.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286370.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用批處理修復 win10 無法升級的問題

win10無法升級&#xff0c;通常的做法是先停止windows update 服務&#xff0c;刪除臨時緩存升級目錄&#xff0c;重新啟動升級服務。 寫成一個批處理文件&#xff0c;直接用管理員身份運行一下就搞定。echo offfor /f "skip3 tokens4" %%i in (sc query wuauserv) d…

http304狀態碼緩存設置問題

當瀏覽器第一次加載資源的時候&#xff0c;返回一般為200&#xff0c;意思是成功獲取資源&#xff0c;并會在瀏覽器的緩存中記錄下max-age&#xff0c;第二次訪問的時候&#xff1a;如果只是用瀏覽器打開&#xff0c;那么瀏覽器會去判斷這個資源在緩存里有沒有&#xff0c;如果…

10.2.0.5啟動enterprise manager

10.2.0.5啟動enterprise manager OEM作為一個實用工具&#xff0c;隨著10g和11g的普及&#xff0c;OEM功能越來越強大&#xff0c;oem也應用越來越廣泛。但是如果是10.2.0.5的版本&#xff0c;并且安裝時間在2010年1月之后&#xff0c;可能會遇到OEM無法啟動的情況&#xff0c;…

【數據結構與算法】多種語言(VB、C、C#、JavaScript)系列數據結構算法經典案例教程合集目錄

文章目錄1. 專欄簡介2. 專欄地址3. 專欄目錄1. 專欄簡介 2. 專欄地址 「 劉一哥與GIS的故事 」之《數據結構與算法》 3. 專欄目錄 【經典回放】多種語言系列數據結構算法&#xff1a;二叉樹&#xff08;JavaScript版&#xff09;【經典回放】多種語言系列數據結構算法&#…

《iVX 高仿美團APP制作移動端完整項目》03 推介信息及推薦商家分析及制作

點擊整個專欄查看其它系列文章 &#xff08;系列文章更新中…&#xff09;&#xff1a;《iVX 高仿美團APP制作移動端完整項目》 項目界面預覽&#xff1a; 一、推薦信息制作 推薦信息與之前的標題下推薦信息制作類似&#xff1a; 此時依舊創建一個行&#xff0c;設置其上下…

C語言試題十二之m個人的成績存放在score數組中,請編寫函數function,它的功能是:將低于平均分的人數作為函數值返回,將低于平均分的分數放在below所指定的數組中。

?作者簡介:大家好我是碼莎拉蒂,CSDN、華為云、阿里云、51CTO博客專家?????? ??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 1、 題目 m個人的成績存放在score數組中,請編寫函…

yum的三種方式

RHEL5中實現各種服務的準備條件&#xff1a;(一)、制作YUM本地源&#xff1a;YUM簡介&#xff1a;YUM是Yellow dog Updater Modified的簡稱&#xff0c;yum是軟件的倉庫&#xff0c;它可以是http或ftp站點&#xff0c;也可以是本地軟件池&#xff0c;但必須包含rpm的header&…

利用百度云盤API上傳文件至百度云盤

一、獲取Access Token示例 1. 請您將以下HTTP請求直接粘貼到瀏覽器地址欄內&#xff0c;并按下回車鍵。 https://openapi.baidu.com/oauth/2.0/authorize?response_typetoken&client_idL6g70tBRRIXLsY0Z3HwKqlRE&redirect_urioob&scopenetdisk 2、執行后&#x…

Docker 容器抓包

背景介紹程序在運行期間出現問題時&#xff0c;通常會通過抓包的方式來分析、定位問題。非容器應用一般可以通過 fiddler、wireshark 等工具進行抓包&#xff0c;那么&#xff0c;運行在容器的應用一般通過什么方式進行抓包呢&#xff1f;容器應用一般可以通過 tcpdump、ngrep …

服務發現與健康監測框架Consul-DNS轉發的應用

關于Consul Consul是一個提供服務注冊與發現&#xff0c;健康監測&#xff0c;Key/Value存儲以及多數據中心存儲的分布式框架。官網地址是https://www.consul.io/&#xff0c;公司初步應用后我們老大覺得這東西有點意思&#xff0c;隨即有了翻譯文檔的想法&#xff0c;由于精力…

【ArcGIS風暴】ArcGIS10.6圖斑橢球面積計算原理與方法

文章目錄 1. 橢球面積計算原理2. ArcGIS計算圖斑橢球面積3. ArcGIS計算圖斑投影平面面積1. 橢球面積計算原理 <

實踐 Neutron 前的兩個準備工作 - 每天5分鐘玩轉 OpenStack(78)

上一節配置了 linux-bridge mechanism driver&#xff0c;本節再做兩個準備工作&#xff1a; 1. 檢視初始的網絡狀態。2. 了解 linux bridge 環境中的各種網絡設備。 初始網絡狀態 我們首先考察實驗環境最初始的網絡狀態。隨著學習的深入&#xff0c;我們會對網絡不斷進行新的配…

《iVX 高仿美團APP制作移動端完整項目》04 美食頁 標題、搜索、商家標題制作

點擊整個專欄查看其它系列文章 &#xff08;系列文章更新中…&#xff09;&#xff1a;《iVX 高仿美團APP制作移動端完整項目》 項目界面預覽&#xff1a; 一、美食頁頂部商家頁制作 1.1 頁面主格調確認 該美食頁為首頁中美食按鈕點擊后進入的頁面。該頁面分為頂部的標題、搜…

利用瀏覽器調試功能 計算 百度網盤 文件數量

“百度網盤”程序做的比較爛&#xff0c;以百度的技術實力按說不應該如此。真正試了就知道真的不怎么樣。為了統計百度網盤的文件寫了以下腳本&#xff0c;僅供參考&#xff1a; var root "";//指定目錄&#xff0c;空取當前目錄 var totalCount 0; var startTime …

C語言試題十三之求出1到100之內能被7或者11整除,但不能同時被7和11整除的所有整書,并將他們放在a所指的數組中,通過n返回這些數的個數。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、 題目 求出1到1…

函數模板

1.函數模板的由來和概念&#xff1a;函數的重載可以實現一個函數名多用&#xff0c;將實現相同的或類似功能的函數用一個函數名來定義。這樣編程者在調用同類函數時感到含義清晰&#xff0c;方法簡單。但在程序中仍然要分別定義每一個函數&#xff0c;例如求三個數的最大值的函…

就在剛剛,HTTP/3 正式發布了!

經過了多年的努力&#xff0c;在 6 月 6 號&#xff0c;IETF &#xff08;互聯網工程任務小組&#xff09; 正式發布了 HTTP/3 的 RFC&#xff0c; 這是超文本傳輸協議&#xff08;HTTP&#xff09;的第三個主要版本&#xff0c;完整的 RFC 超過了 20000 字&#xff0c;非常詳細…

C語言試題十四之使字符串的前導*號不得多于n個;若多于n個,則刪除多于的*號;若少于或等于n個,則什么也不做。字符串中間和尾部的*號不刪除。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 請編寫函數…

通渭縣義崗川鎮之行(2020年11月19日)

2020年11月18日&#xff0c;應邀前往通渭縣義崗川鎮老家&#xff0c;經過了3個小時的自駕車程&#xff0c;夜幕降臨時刻到達了美麗的義崗川小鎮。 義崗川鎮&#xff0c;隸屬甘肅省定西市通渭縣&#xff0c;地處通渭縣城最北部&#xff0c;東南與寺子川鄉毗連&#xff0c;南鄰北…

python基礎===PEP網站,代碼規范指南

PEP 8是最古老的PEP之一&#xff0c;它向Python程序員提供了代碼格式設置指南。PEP 8的篇幅很長&#xff0c;但大都與復雜的編碼結構相關。 https://python.org/dev/peps/pep-0008/轉載于:https://www.cnblogs.com/botoo/p/7830980.html