FluentObjectValidator เป็นไลบรารีการตรวจสอบความถูกต้องขนาดเล็กและเรียบง่ายที่ให้อินเทอร์เฟซที่คล่องแคล่วสำหรับการกำหนดค่ากฎ
ไลบรารีมีไว้เพื่อให้ทางเลือกในการตรวจสอบความถูกต้องตามแอตทริบิวต์ของโมเดล (จำเป็นต้องใช้งาน, StringLengthAttribute, ฯลฯ )
ห้องสมุดเป้าหมาย. NET Standart 1.0, .NET 4.0, .NET 4.5
ห้องสมุดมีให้บริการเป็นแพ็คเกจ NUGET
นี่คือขั้นตอนที่จะช่วยคุณกำหนดค่าการตรวจสอบในแอพของคุณ
สิ่งแรกสิ่งแรกคุณจะต้องตัดสินใจว่าคุณต้องการรับข้อมูลใดเมื่อโมเดลบางรุ่นไม่ผ่านการตรวจสอบ
คลาสหลักที่ให้ฟังก์ชันการตรวจสอบความถูกต้องคือ:
Validator - ส่งคืนค่าบูลีนซึ่งบ่งบอกถึงการตรวจสอบความถูกต้องที่ผ่านหรือไม่Validator<TError> - ส่งคืนอินสแตนซ์ของวัตถุ ValidationResult<TError> ซึ่งมีค่าบูลีนและชุดของวัตถุ TError ที่กำหนดเองที่จะแสดงให้คุณเห็นอย่างชัดเจนว่ากฎใดที่ไม่ผ่านหลังจากที่คุณตัดสินใจว่าจะใช้ตัวตรวจสอบความถูกต้องสิ่งที่คุณต้องทำคือสืบทอดมาจากมันและเพิ่มการกำหนดค่าเช่น:
public class MyValidator : Validator
{
public MyValidator ( )
{
AddConfiguration ( new ProductDTOConfiguration ( ) ) ;
AddConfiguration ( new UserDTOConfiguration ( ) ) ;
}
} public class MyValidator : Validator < MyCustomError >
{
public MyValidator ( )
{
AddConfiguration ( new ProductDTOConfiguration ( ) ) ;
AddConfiguration ( new UserDTOConfiguration ( ) ) ;
}
}สิ่งนี้นำเราไปสู่ขั้นตอนต่อไป
ในการกำหนดค่ากฎที่วัตถุของคุณควรปฏิบัติตามคุณต้องสร้างคลาสการกำหนดค่าสำหรับแต่ละประเภทที่คุณต้องการตรวจสอบ
ขึ้นอยู่กับตัวตรวจสอบที่เลือกการกำหนดค่าทั้งหมดที่สืบทอดมาจาก ValidationConfiguration<TObject> หรือ ValidationConfiguration<TObject, TError>
ValidationConfiguration<TObject> public class ProductDTOConfiguration : ValidationConfiguration < ProductDTO >
{
public ProductDTOConfiguration ( )
{
Property ( x => x . Title )
. IsRequired ( )
. HasRule ( x => x . Length <= 10 ) ;
}
}หลังจากเลือกคุณสมบัติคุณสามารถเพิ่มกฎการตรวจสอบความถูกต้องในลักษณะที่คล่องแคล่ว
คุณสามารถกำหนดกฎใด ๆ ด้วยวิธี HasRule แต่มีทางลัดที่กำหนดไว้ล่วงหน้าหลายอย่างเช่น IsRequired สำหรับวัตถุทั้งหมดและ HasMinLength , HasMaxLength , HasLengthInRange , MatchesRegex เฉพาะ
การตรวจสอบความถูกต้องเกิดขึ้นตามลำดับตามลำดับกฎถูกกำหนดและส่งคืน false ทันทีที่กฎข้อใดข้อหนึ่งไม่ผ่านหรือ true หากทั้งหมดผ่านไป
ValidationConfiguration<TObject, TError> public class ProductDTOConfiguration : ValidationConfiguration < ProductDTO , MyCustomError >
{
public ProductDTOConfiguration ( )
{
Property ( x => x . Title )
. IsRequired ( ( ) => new MyCustomError ( "Title is required" ) )
. HasRule (
x => x . Length <= 10 ,
( ) => new MyCustomError ( "Title is too long" ) ) ;
}
}การกำหนดค่าการตรวจสอบความถูกต้องซึ่งส่งคืนข้อผิดพลาดที่กำหนดเองในกรณีที่ความล้มเหลวนั้นซับซ้อนกว่าเล็กน้อย
หลังจากเลือกคุณสมบัติและกำหนดกฎตอนนี้คุณต้องเพิ่มตัวแทนที่จะใช้ในการสร้างวัตถุข้อผิดพลาดหากกฎไม่ผ่าน
การตรวจสอบความถูกต้องยังเกิดขึ้นตามลำดับในลำดับที่กฎถูกกำหนด แต่หากกฎข้อใดข้อหนึ่งไม่ผ่านข้อผิดพลาดจะถูกเพิ่มเข้าไปในผลลัพธ์และการตรวจสอบยังคงดำเนินต่อไป
คุณสามารถกำหนดค่าการตรวจสอบเพื่อข้ามส่วนที่เหลือของกฎสำหรับคุณสมบัติปัจจุบันหรือสำหรับวัตถุทั้งหมดในกรณีที่กฎเฉพาะไม่ผ่าน มันสามารถทำได้โดยการผ่านพารามิเตอร์บูลีนที่เป็นตัวเลือกที่สอดคล้องกัน stopValidationOnError และ terminateValidationOnError ไปยังวิธี HasRule ทั้งคู่เป็นเท็จโดยค่าเริ่มต้น
วิธีการ IsRequired จะข้ามส่วนที่เหลือของกฎสำหรับคุณสมบัติเสมอเนื่องจากเราไม่จำเป็นต้องตรวจสอบกฎอื่น ๆ หากคุณสมบัติเป็นตัวอย่างเท่ากับ NULL
กฎทางลัดเช่น IsRequired , HasMaxLength ถูกนำไปใช้ผ่านวิธีการขยายดังนั้นคุณสามารถเพิ่มทางลัดของคุณเองในโครงการของคุณได้อย่างง่ายดาย
หลังจากกำหนดค่ากฎตอนนี้คุณสามารถสร้างอินสแตนซ์ของตัวตรวจสอบความถูกต้องของคุณและใช้งานได้ทุกที่ที่คุณต้องการ
var res = validator . Validate ( obj ) ;แต่ละตัวตรวจสอบจะเปิดเผยวิธี 'ตรวจสอบ' สาธารณะเดียวซึ่งสามารถใช้งานได้ผ่านอินเตอร์เฟส:
public interface IValidator < TError >
{
ValidationResult < TError > Validate < TObject > ( TObject target ) ;
}
public interface IValidator
{
bool Validate < TObject > ( TObject target ) ;
}นั่นเป็นเหตุผลที่คุณสามารถใช้งานได้อย่างง่ายดายด้วยการฉีดพึ่งพา:
services . AddSingleton < IValidator , MyValidator > ( ) container . Register < IValidator < MyCustomError > , MyValidator > ( Lifestyle . Singleton ) ;การกำหนดค่าทั้งหมดจะถูกโหลดและตรวจสอบความถูกต้องในระหว่างการสร้างอินสแตนซ์ของตัวตรวจสอบความถูกต้องดังนั้นตามความเห็นของฉันมันเป็นการดีที่สุดที่จะใช้เป็นซิงเกิล
โครงการนี้ได้รับใบอนุญาตภายใต้ใบอนุญาต MIT - ดูไฟล์ใบอนุญาตสำหรับรายละเอียด
วิธีที่การกำหนดค่ากฎเกิดขึ้นได้รับแรงบันดาลใจจาก Entity Framework 6 และวิธีการกำหนดค่าความสัมพันธ์ระหว่างเอนทิตี