Attribute特性验证模型model
数据验证我们往往分为前台验证和后台验证,而我们的后台验证每到一个方法中就要去验证一次,这样的代码想想都难以维护,这篇我们这篇文章就是为了解决这样的问题。用attribute 这个特性来解决这样的问题
也将在这篇文章中告诉大家如何编写。
调用方式:
UserService applictionService = container.Resolve<UserService>();
applictionService.AddUser(new User() { Name = "",Age="bu gai " }); Console.ReadLine();
User 类:
public class User
{
[StringLength(,)]
public string Name { get; set; }
[StringLength(,)]
public string Age { get; set; }
}
结果:

要做到上面的效果,笔者用的技术有:
1.Castle 的依赖注入
2.Castle 的动态代理技术
3.Attribute特性的了解
4.反射技术
如果上面的技术你还不了解得话,你可以借助百度进行自行脑补
在介绍细节之前,我们先来看看笔者的一个目录结构,然后在介绍每个类的细节

1.ServiceInstaller:是这个test项目的核心依赖注入类
2.User :是测试model
3.IApplicationService:是服务的接口,在这里你们可以理解成mvc控制器接口
4.OrderService,UserService是两个实现类,
5.ServiceInterceptor:是动态代理类,也是实现这个功能的核心
6.MethodInvocationValidator:是在方法执行之前进行实体model的验证
7.ValidateAttribute:是验证的基类
8.StringLength:是特性字符串长度的验证
上面的有些类我就不一一进行讲解,主要讲解的就是ServiceInstaller,MethodInvocationValidator,ServerInterceptor
ServiceInstaller代码:
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<IWindsorContainer>().Instance(container).LifestyleSingleton()); container.Register(Classes.FromThisAssembly().BasedOn<IApplicationService>().WithService.DefaultInterfaces()); container.Register(Classes.FromThisAssembly().BasedOn<IInterceptor>().WithService.DefaultInterfaces()); container.Register(Component.For<MethodInvocationValidator>().LifestyleTransient()); } public static void Init(IWindsorContainer container)
{
container.Kernel.ComponentRegistered += Kernel_ComponentRegistered;
} private static void Kernel_ComponentRegistered(string key, Castle.MicroKernel.IHandler handler)
{
if (typeof(IApplicationService).IsAssignableFrom(handler.ComponentModel.Implementation))
{
handler.ComponentModel.Interceptors.Add(new Castle.Core.InterceptorReference(typeof(ServiceInterceptor.ServiceInterceptor)));
}
}
第一注入就是对IWindsorContainer 自身的一个注入,因为其他要用到它,它是一个单例模式的。
对也剩下的我想大家都懂,就是对这个应用程序集,继承自IApplicationService,IInterceptor的实体类进行注入,container.Kernel.ComponentRegistered是每注入一个组件就是执行这个事件,当我们注册的组件中继承了IApplication的实体类进行动态代理注入,
ServerInterceptor 代码:
public class ServiceInterceptor : IInterceptor
{
private readonly IWindsorContainer _container;
public ServiceInterceptor(IWindsorContainer contaier)
{
_container = contaier;
}
public void Intercept(IInvocation invocation)
{
try
{
var methodValidator = _container.Resolve<MethodInvocationValidator>();
methodValidator.Initialize(invocation.Method, invocation.Arguments);
methodValidator.Validator();
invocation.Proceed();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
} }
}
这个类就是每当调用service实体类时的方法时,就会触发这个Intercept方法, invovation参数包含了方法的信息和方法的参数数据,为我们反射提供基础
MethodInvocationValidator 代码:
//验证属性是否通过
public void Validator()
{
for (int i=;i<Method.GetParameters().Length;i++)
{
var paraInfo = Method.GetParameters()[i];
foreach (PropertyInfo proInfo in paraInfo.ParameterType.GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
foreach (CustomAttributeData attr in proInfo.CustomAttributes)
{ var df= (ValidateAttribute) Activator.CreateInstance(attr.AttributeType, GetConstructorArguments(attr.ConstructorArguments));
var result= df.IsValidate(proInfo.GetValue(ParameterValues[i]));
if (!result)
{
ValidationErrors.Add(df.FormatMsgs(proInfo.Name));
} }
}
if (ValidationErrors.Count > )
{
throw new Exception(ValidationErrors[]);
}
}
}
这个主要对调用方法的的参数进行反射,如果验证通过则调用原本的方法,不通过在一个新的异常,在外面捕获,并打印出来,
最后:如果有什么不懂地方欢迎留言,dome链接 http://files.cnblogs.com/files/xuehaiyiye/TestNanHua.zip
Attribute特性验证模型model的更多相关文章
- Net中Attribute特性的高级使用及自定义验证实现
		好久没写博客了,今天在百忙之中抽空来写篇文章,记录一下最近深入学习Attribute特性的笔记及心得.~~ 一.什么是特性? 特性(Attribute)是用于在运行时传递程序中各种元素(比如类.方法. ... 
- 【再探backbone 01】模型-Model
		前言 点保存时候不注意发出来了,有需要的朋友将就看吧,还在更新...... 几个月前学习了一下backbone,这段时间也用了下,感觉之前对backbone的学习很是基础,前几天有个园友问我如何将路由 ... 
- MVC的验证(模型注解和非侵入式脚本的结合使用)   .Net中初探Redis   .net通过代码发送邮件  Log4net (Log for .net)  使用GDI技术创建ASP.NET验证码  Razor模板引擎 (RazorEngine) .Net程序员应该掌握的正则表达式
		MVC的验证(模型注解和非侵入式脚本的结合使用) @HtmlHrlper方式创建的标签,会自动生成一些属性,其中一些属性就是关于验证 如图示例: 模型注解 通过模型注解后,MVC的验证,包括前台客 ... 
- ThinkPHP 模型(Model)命名规范
		一个小问题搞了好久:如果数据库的表名中有下划线,那么在用thinkphp做自动完成时注意Model类的命名要变成驼峰法,文件名和类名都要变.( 另外注意:只有使用create方法创建数据时才能调用到自 ... 
- sencha touch之模型(model)
		模型的实例相当于数据库中表的一条记录. 一般模型在\app\model下创建,而且必须遵守类的命名规则,也就是可以根据类名找到模型的定义文件. 所有模型类都要从Ext.data.Model或Ext.d ... 
- 利用libsvm-mat建立分类模型model参数解密[zz from faruto]
		本帖子主要就是讲解利用libsvm-mat工具箱建立分类(回归模型)后,得到的模型model里面参数的意义都是神马?以及如果通过model得到相应模型的表达式,这里主要以分类问题为例子. 测试数据使用 ... 
- 【在 Nervos CKB 上做开发】Nervos CKB 脚本编程简介[1]:验证模型
		CKB 脚本编程简介[1]: 验证模型 本文作者:Xuejie 原文链接:Introduction to CKB Script Programming 1: Validation Model 本文译者 ... 
- .NET进阶篇03-Reflection反射、Attribute特性
		知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂 内容目录 一.概述二.反射1.反射使用2.创建对象3.调用方法4.字段属性三.特性四.总结 一.概述 反射其实无处不在,我们用VS进行调试时候, ... 
- ASP.NET MVC在布局页上使用模型(model)
		看到这标题有点怪,一般情况之下,我们很容易在视图与部分视图中使用模型(model),但是如果想在布局页_Layout.cshtml页中使用模型(model),按照普通方式也许没有达到预期的效果,在实现 ... 
随机推荐
- js团购倒计时
			客户端代码可以看: http://www.zhangxinxu.com/wordpress/2010/07/%E5%9B%A2%E8%B4%AD%E7%B1%BB%E7%BD%91%E7%AB%99% ... 
- hdu 4642 Fliping game(博弈)
			题目:http://acm.hdu.edu.cn/showproblem.php?pid=4642 题意:给定一个棋盘,0表示向下,1表示向上,选一个x,y, 然后翻转从x,y 到n,m.的所有硬币, ... 
- NLog 传递参数
			用NLog记文件日志,一般都用{$basedir}变量,把日志记在运行的目录或者它的子目录下,遇到要写在其他目录的下,看了下Nlog找到用环境变量传参数. .net 里写 Environment.Se ... 
- storm - 基础概念整理
			理论 Hadoop的出现虽然为大数据计算提供了一条捷径,但其仍然存在自身难以克服的缺点:实时性不足.Hadoop的一轮计算的启动需要较长时间,因此其满足不了对实时性有较高要求的场景. Storm由此应 ... 
- Sencha touch navigation 内嵌list,itemTap第二次点击不跳转的问题
			情景:navigation view 内嵌list,第一次触发list事件itemtap,正常跳转至详情页,点击"defaultBackButton"返回至list正常;再次点击触 ... 
- bzoj1196:[Hnoi2010]chorus 合唱队
			这数据范围明显的区间dp啊...然而据说二维会wa...那就写三维把... #include<cstdio> #include<cstring> #include<cct ... 
- 51nod水题记
			妈呀51nod已经刷不动了又开始跟bzoj一样总是得看题解了...那么发一下总结吧... 1051:最大子矩阵 #include<cstdio> #include<cstring&g ... 
- 【众秒之门 JavaScript与jQuery技术精粹 #BOOK#】第4章 数据类型及定义
			<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ... 
- 探秘Java虚拟机——内存管理与垃圾回收
			本文主要是基于Sun JDK 1.6 Garbage Collector(作者:毕玄)的整理与总结,原文请读者在网上搜索. 1.Java虚拟机运行时的数据区 2.常用的内存区域调节参数 -Xms:初始 ... 
- 移植mysql到嵌入式ARM平台
			移植MySQL到嵌入式ARM平台 MySQL没有专门针对ARM的版本,移植到ARM没有官方文档可参考,因此,暂时参考这样一篇文档: http://blog.chinaunix.net/space.p ... 
