中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

EF架構~FluentValidation實體(ti)檢驗與實體(ti)分(fen)離了

回到目錄

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

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

而這(zhe)種設計(ji)方式給我(wo)們以(yi)后的維護帶來很多問(wen)題,具體大叔總結(jie)一下:

  1. 與數據實體混在一起,不利用擴展,更新實體你加的特性可能會丟失
  2. 如果有多個VO,那么你需要把它加到具體的VO上,因為DO的語義可能不太明確
  3. 不方便遷移,它與ModelState耦合太高
  4. 從面向對象的角度來看,它的職責太單一,引起變因太多

綜(zong)上所述,FluentValidation就誕生(sheng)了!

nuget上去安裝它:install-package FluentValidation

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

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

使用(yong)時,可以通過IsValid,Errors等屬(shu)性(xing)拿(na)到你需要(yao)(yao)的信息,當然,你也可以把(ba)它在命令事件,領域事件上用(yong)一下(xia),比如做(zuo)個驗證的裝(zhuang)飾(shi)器,哪些處(chu)理程序要(yao)(yao)用(yong)校驗,就(jiu)通過這(zhe)個裝(zhuang)飾(shi)器裝(zhuang)飾(shi)一下(xia)就(jiu)行了,挺優雅(ya)!

   //驗(yan)證-裝飾器
   BusManager.Instance.Subscribe(new ValidatorDecorator<CreateUserEvent>(
new UserEventHandler(),
new CreateUserEventValidator())); //日志-裝飾(shi)器 BusManager.Instance.Subscribe(new LoggerDecorator<CreateUserEvent>(new UserEventHandler())); BusManager.Instance.Publish(new CreateUserEvent { UserName = "占(zhan)占(zhan)大師5個(ge)字" });

裝(zhuang)(zhuang)飾器(qi)要求你轉一個要被裝(zhuang)(zhuang)飾的對象(xiang)和(he)一個裝(zhuang)(zhuang)飾器(qi),就可以了。

    /// <summary>
    /// 驗證裝飾器
    /// </summary>
    /// <typeparam name="TEvent"></typeparam>
    [Serializable]
    public class ValidatorDecorator<TEvent>
       : IBusHandler<TEvent>
        where TEvent : IBusData
    {
        /// <summary>
        /// 要被裝飾的(de)處(chu)理程序
        /// </summary>
        private readonly IBusHandler<TEvent> _inner;
        /// <summary>
        /// 校驗裝(zhuang)飾器集合
        /// </summary>
        private readonly IValidator<TEvent>[] _validators;

        /// <summary>
        /// 初始化(hua)
        /// </summary>
        /// <param name="inner">要被裝飾(shi)的處理程(cheng)序</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("實(shi)體校驗失(shi)敗", failures);
            }

            _inner.Handle(evt);
        }
    }

對于一種知識的學習與(yu)理(li)解是(shi)需要一些理(li)論(lun)基礎的,大(da)家可(ke)以(yi)多(duo)看(kan)看(kan)設計模塊(kuai),算法導(dao)論(lun),.netCLR等書籍!

感謝各位的閱讀!

回到目錄

 

posted @ 2017-06-01 17:05  張占嶺  閱讀(1464)  評論(0)    收藏  舉報