您好,登錄后才能下訂單哦!
今天小編給大家分享的是FluentValidation的實(shí)際用法的詳細(xì)介紹,相信很多人都不太了解,為了讓大家更加了解FluentValidation的實(shí)際用法,所以給大家總結(jié)了以下內(nèi)容,話不多說,一起往下看吧。
在MVC,EF,LINQ環(huán)境里,我們經(jīng)常會用到DataModel(DO)和ViewModel(VO),可能對于它們的屬性校驗(yàn)我們會采用特性的方式,當(dāng)然這很直觀,就連微軟的DEMO也是如些,一般是這樣的代碼
/// <summary>/// 機(jī)構(gòu)ID/// </summary>[DisplayName("機(jī)構(gòu)ID")]public int AgentId { get; set; }/// <summary>/// 機(jī)構(gòu)名稱/// </summary>[DisplayName("機(jī)構(gòu)名稱")] [MaxLength(128)]public string AgentName { get; set; }/// <summary>/// 機(jī)構(gòu)負(fù)責(zé)人/// </summary>[DisplayName("機(jī)構(gòu)負(fù)責(zé)人")] [MaxLength(128)]public string AgentUser { get; set; }
而這種設(shè)計(jì)方式給我們以后的維護(hù)帶來很多問題,具體大叔總結(jié)一下:
與數(shù)據(jù)實(shí)體混在一起,不利用擴(kuò)展,更新實(shí)體你加的特性可能會丟失
如果有多個VO,那么你需要把它加到具體的VO上,因?yàn)镈O的語義可能不太明確
不方便遷移,它與ModelState耦合太高
從面向?qū)ο蟮慕嵌葋砜?,它的職?zé)太單一,引起變因太多
綜上所述,F(xiàn)luentValidation就誕生了!
nuget上去安裝它:install-package FluentValidation
你的一個實(shí)體類,可以添加多個檢驗(yàn)類,這相當(dāng)于可以有多種檢驗(yàn)類去裝飾一個實(shí)體類,我覺得挺好!
public class CreateUserEventValidator : AbstractValidator<CreateUserEvent>{public CreateUserEventValidator() { RuleFor(command => command.UserName).NotEmpty().Length(5, 20).WithMessage("用戶名升序?yàn)?-20字符!"); RuleFor(command => command.Email).NotEmpty().EmailAddress().WithMessage("不是有效的Email!"); RuleFor(command => command.BirthDay).NotEmpty().Must(i => i < DateTime.Now).WithMessage("你的年紀(jì)太小了!"); } }
使用時,可以通過IsValid,Errors等屬性拿到你需要的信息,當(dāng)然,你也可以把它在命令事件,領(lǐng)域事件上用一下,比如做個驗(yàn)證的裝飾器,哪些處理程序要用校驗(yàn),就通過這個裝飾器裝飾一下就行了,挺優(yōu)雅!
BusManager.Instance.Subscribe( ValidatorDecorator<CreateUserEvent>( UserEventHandler(), BusManager.Instance.Subscribe( LoggerDecorator<CreateUserEvent>( CreateUserEvent { UserName = });
裝飾器要求你轉(zhuǎn)一個要被裝飾的對象和一個裝飾器,就可以了。
/// <summary>/// 驗(yàn)證裝飾器/// </summary>/// <typeparam name="TEvent"></typeparam> [Serializable]public class ValidatorDecorator<TEvent> : IBusHandler<TEvent>where TEvent : IBusData {/// <summary>/// 要被裝飾的處理程序/// </summary>private readonly IBusHandler<TEvent> _inner;/// <summary>/// 校驗(yàn)裝飾器集合/// </summary>private readonly IValidator<TEvent>[] _validators;/// <summary>/// 初始化/// </summary>/// <param name="inner">要被裝飾的處理程序</param>/// <param name="validators">裝飾器</param>public ValidatorDecorator(IBusHandler<TEvent> inner, params IValidator<TEvent>[] validators) { _inner = inner; _validators = validators; }public void Handle(TEvent evt) {var failures = _validators .Select(v => v.Validate(evt)) .SelectMany(result => result.Errors) .Where(error => error != null) .ToList();if (failures.Any()) {throw new ValidationException("實(shí)體校驗(yàn)失敗", failures); } _inner.Handle(evt); } }
對于一種知識的學(xué)習(xí)與理解是需要一些理論基礎(chǔ)的,大家可以多看看設(shè)計(jì)模塊,算法導(dǎo)論,.netCLR等書籍!
看完上訴內(nèi)容,你們對FluentValidation的實(shí)際用法大概了解了嗎?如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。