91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

FluentValidation的實際用法

發布時間:2020-05-08 09:52:07 來源:億速云 閱讀:829 作者:Leah 欄目:編程語言

今天小編給大家分享的是FluentValidation的實際用法的詳細介紹,相信很多人都不太了解,為了讓大家更加了解FluentValidation的實際用法,所以給大家總結了以下內容,話不多說,一起往下看吧。

在MVC,EF,LINQ環境里,我們經常會用到DataModel(DO)和ViewModel(VO),可能對于它們的屬性校驗我們會采用特性的方式,當然這很直觀,就連微軟的DEMO也是如些,一般是這樣的代碼

        /// <summary>/// 機構ID/// </summary>[DisplayName("機構ID")]public int AgentId { get; set; }/// <summary>/// 機構名稱/// </summary>[DisplayName("機構名稱")]
        [MaxLength(128)]public string AgentName { get; set; }/// <summary>/// 機構負責人/// </summary>[DisplayName("機構負責人")]
        [MaxLength(128)]public string AgentUser { get; set; }

而這種設計方式給我們以后的維護帶來很多問題,具體大叔總結一下:

  1. 與數據實體混在一起,不利用擴展,更新實體你加的特性可能會丟失

  2. 如果有多個VO,那么你需要把它加到具體的VO上,因為DO的語義可能不太明確

  3. 不方便遷移,它與ModelState耦合太高

  4. 從面向對象的角度來看,它的職責太單一,引起變因太多

綜上所述,FluentValidation就誕生了!

nuget上去安裝它:install-package FluentValidation

你的一個實體類,可以添加多個檢驗類,這相當于可以有多種檢驗類去裝飾一個實體類,我覺得挺好!

   public class CreateUserEventValidator : AbstractValidator<CreateUserEvent>{public CreateUserEventValidator()
        {
            RuleFor(command => command.UserName).NotEmpty().Length(5, 20).WithMessage("用戶名升序為5-20字符!");
            RuleFor(command => command.Email).NotEmpty().EmailAddress().WithMessage("不是有效的Email!");
            RuleFor(command => command.BirthDay).NotEmpty().Must(i => i < DateTime.Now).WithMessage("你的年紀太小了!");
        }
    }

使用時,可以通過IsValid,Errors等屬性拿到你需要的信息,當然,你也可以把它在命令事件,領域事件上用一下,比如做個驗證的裝飾器,哪些處理程序要用校驗,就通過這個裝飾器裝飾一下就行了,挺優雅!

   
   BusManager.Instance.Subscribe( ValidatorDecorator<CreateUserEvent>(
 UserEventHandler(),

   BusManager.Instance.Subscribe( LoggerDecorator<CreateUserEvent>( CreateUserEvent { UserName =  });

裝飾器要求你轉一個要被裝飾的對象和一個裝飾器,就可以了。

    /// <summary>/// 驗證裝飾器/// </summary>/// <typeparam name="TEvent"></typeparam>    [Serializable]public class ValidatorDecorator<TEvent>   : IBusHandler<TEvent>where TEvent : IBusData
    {/// <summary>/// 要被裝飾的處理程序/// </summary>private readonly IBusHandler<TEvent> _inner;/// <summary>/// 校驗裝飾器集合/// </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("實體校驗失敗", failures);
            }

            _inner.Handle(evt);
        }
    }

對于一種知識的學習與理解是需要一些理論基礎的,大家可以多看看設計模塊,算法導論,.netCLR等書籍!

看完上訴內容,你們對FluentValidation的實際用法大概了解了嗎?如果想了解更多相關文章內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新干县| 故城县| 双辽市| 盈江县| 忻城县| 丰宁| 吉安市| 新蔡县| 拜城县| 民和| 项城市| 彩票| 鹰潭市| 鸡泽县| 北碚区| 樟树市| 雷山县| 延川县| 邢台市| 龙岩市| 大关县| 白银市| 松江区| 龙门县| 江永县| 保靖县| 龙泉市| 鄂尔多斯市| 建昌县| 沛县| 清河县| 丰宁| 邓州市| 湖南省| 逊克县| 板桥市| 淳化县| 南康市| 银川市| 蒙城县| 环江|