编程知识 购物 网址 新闻 笑话 | 软件 日历 阅读 图书馆 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
   -> 领域驱动设计 -> [Architect] Abp 框架原理解析(4) Validation -> 正文阅读

[领域驱动设计][Architect] Abp 框架原理解析(4) Validation

本节目录
介绍 DataAnnotations ICustomValidate IShouldNormalize 实现Abp Validation
介绍
Abp中在Application层集成了validation.
直接上代码吧.
DataAnnotations
这是微软提供的一套验证框架,只用引用程序集System.ComponentModel.DataAnnotations.
自带的各种特性标签就不说了,默认在MVC中已集成此验证.
这里说下验证方法:

        static void Main(string[] args)
        {
            var obj = new object();
            var rst = new StringLengthAttribute(10) { MinimumLength = 6 }.GetValidationResult("Never", new ValidationContext(obj) { DisplayName = "名称", MemberName = "Name" });
            Console.WriteLine(rst);
            Console.ReadKey();
        }

运行结果:


ValidationResult对象


在MVC中,obj指的是验证的对象,DisplayName指DisplayName特性的Name值,Member指字段代码名.
ICustomValidate
该接口在标准验证结束后调用.

    public interface ICustomValidate : IValidate
    {
        void AddValidationErrors(List<ValidationResult> results);
    }

通常会如下操作:

    public class CreateTaskInput : IInput, ICustomValidate
    {
        public string Name { get; set; }
        public void AddValidationErrors(List<ValidationResult> results)
        {
            if (Name == "xx")
            {
                results.Add(new ValidationResult("Task 名非法"));
            }
        }
    }

当标准验证功能无法完成某些特定的验证功能,可以使用此接口.
IShouldNormalize
该接口并非验证字段,而是在验证完字段,离开验证过滤器前的时候执行.
一般在此接口做初始化或者其他操作.

    public interface IShouldNormalize
    {
        void Normalize();
    }

如:

    public class CreateTaskInput : IInput, IShouldNormalize
    {
        public string Name { get; set; }
        public void Normalize()
        {
            Name = DateTime.Now.ToShortDateString() + "-task";
        }
    }

  
实现Abp Validation
在Abp中大致会经历这3个接口.
在这里,仿照Abp验证
先定义接口

    public interface IInput
    {

    }
    public interface IShouldNormalize
    {
        void Normalize();
    }
    public interface ICustomValidate
    {
        void AddValidationErrors(List<ValidationResult> results);
    }

定义Dto

    public class CreateTaskInput : IInput, IShouldNormalize, ICustomValidate
    {
        [StringLength(10, MinimumLength = 5)]
        public string Name { get; set; }

        public void Normalize()
        {
            Name = DateTime.Now.ToShortDateString() + "-task";
        }

        public void AddValidationErrors(List<ValidationResult> results)
        {
            if (Name == "xx")
            {
                results.Add(new ValidationResult("Task 名非法"));
            }
        }
    }

定义ApplicationService

    public interface ITaskAppService
    {
        void CreateTask(CreateTaskInput input);
    }

    public class TaskAppService : ITaskAppService
    {
        public void CreateTask(CreateTaskInput input)
        {
            Console.WriteLine("进入CreateTask方法:" + input.Name);
        }
    }

定义拦截器

    public class ValidateInterceptor : IInterceptor
    {
        public void Intercept(IInvocation invocation)
        {
            new MethodInvocationValidator(invocation.Arguments).Validate();
            invocation.Proceed();
        }
    }

验证逻辑

    internal class MethodInvocationValidator
    {
        private readonly object[] _parameterValues;
        private readonly List<ValidationResult> _validationErrors;

        /// <summary>
        /// Creates a new <see cref="MethodInvocationValidator"/> instance.
        /// </summary>
        /// <param name="parameterValues">List of arguments those are used to call the <paramref name="method"/>.</param>
        public MethodInvocationValidator(object[] parameterValues)
        {
            _parameterValues = parameterValues;
            _validationErrors = new List<ValidationResult>();
        }

        public void Validate()
        {
            //basic validate
            for (var i = 0; i < _parameterValues.Length; i++)
            {
                ValidateObjectRecursively(_parameterValues[i]);
            }
       //throw exception
            if (_validationErrors.Any())
            {
                foreach (var validationResult in _validationErrors)
                {
                    Console.WriteLine("{0}:{1}", validationResult.MemberNames.FirstOrDefault(), validationResult.ErrorMessage);
                }
                throw new Exception("有参数异常");
            }
       //normalize foreach (var parameterValue in _parameterValues) { if (parameterValue is IShouldNormalize) { (parameterValue as IShouldNormalize).Normalize(); } } } private void ValidateObjectRecursively(object validatingObject) { var properties = TypeDescriptor.GetProperties(validatingObject).Cast<PropertyDescriptor>(); foreach (var property in properties) { var validationAttributes = property.Attributes.OfType<ValidationAttribute>().ToArray(); if (validationAttributes.IsNullOrEmpty()) { continue; } var validationContext = new ValidationContext(validatingObject) { DisplayName = property.Name, MemberName = property.Name }; foreach (var attribute in validationAttributes) { var result = attribute.GetValidationResult(property.GetValue(validatingObject), validationContext); if (result != null) { _validationErrors.Add(result); } } }         //custom validate if (validatingObject is ICustomValidate) { (validatingObject as ICustomValidate).AddValidationErrors(_validationErrors); } } }

  
执行

        static void Main(string[] args)
        {
            using (var container = new WindsorContainer())
            {
                container.Register(Component.For<IInterceptor, ValidateInterceptor>());//先注入拦截器
                container.Kernel.ComponentRegistered += Kernel_ComponentRegistered;
                container.Register(Component.For<ITaskAppService, TaskAppService>());
                var person = container.Resolve<ITaskAppService>();
                person.CreateTask(new CreateTaskInput() { Name = "123" });
            }
            Console.ReadKey();
        }

        static void Kernel_ComponentRegistered(string key, Castle.MicroKernel.IHandler handler)
        {
            handler.ComponentModel.Interceptors.Add(new InterceptorReference(typeof(ValidateInterceptor)));
        }



将name改成"12345"


本文地址:http://neverc.cnblogs.com/p/5267425.html
  领域驱动设计 最新文章
领域驱动设计的基础知识总结
海西 · 云交付 DevOps实践落地方案
多服务器终端交互利器
《静儿的服务治理私房菜》服务治理和架构
服务治理概述
美团.点评服务治理框架
ASP.NET Zero
1.领域驱动简介.2.领域.子域.限界上下文.3.
东麓庄园系统开发
东麓庄园系统开发
上一篇文章      下一篇文章      查看所有文章
加:2016-03-12 15:39:04  更:2017-05-16 03:46:29 
 
360图书馆 软件开发资料 购物精选 新闻资讯 Chinese Culture 三丰软件 开发 中国文化 阅读网 日历 万年历 2019年11日历
2019-11-13 1:14:00
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  编程知识