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),按照普通方式也许没有达到预期的效果,在实现 ...
随机推荐
- WCF实例上下文
实例上下文模式(IntanceContext Mode)表示服务端的服务实例与客户端的服务代理的绑定方式. 在WCF中有三种不同的实例上下文模式,单调(Per-Call)模式,会话(Per-Sessi ...
- 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)
2013-08-22 14:55:33 八大排序方法汇总(选择排序-简单选择排序.堆排序,插入排序-简单插入排序.shell排序,交换排序-冒泡排序.快速排序,归并排序,计数排序). 插入排序还可以和 ...
- Statement和PreparedStatement的特点 MySQL数据库分页 存取大对象 批处理 获取数据库主键值
1 Statement和PreparedStatement的特点 a)对于创建和删除表或数据库,我们可以使用executeUpdate(),该方法返回0,表示未影向表中任何记录 b)对于创建和 ...
- 不输入密码ssh直接登录阿里云Linux主机
服务器环境:阿里云云服务器,Linux版本 - CentOS 客户端环境:Mac OSX Terminal 注意: 如果有3个账号都要无密码登录, 则3个账号都要这么操作 在Terminal中用ssh ...
- 在XML里的XSD和DTD以及standalone的使用
有关XML结构中的XSD和DTD以及standalone的使用 XmlDeclaration declare= document.CreateXmlDeclaration("1.0" ...
- wince下sources\sources.cmn\Makefile.def的相关作用
1:首先是Makefile.def: ---------------------------------------- 在所有驱动的makefile中有!INCLUDE $(_MAKEENVROOT) ...
- entity framework 查询
1.简单查询: SQL: SELECT * FROM [Clients] WHERE Type=1 AND Deleted=0 ORDER BY ID EF: //Func形式 var clients ...
- poj2001 Shortest Prefixes (trie)
读入建立一棵字母树,并且每到一个节点就增加这个节点的覆盖数. 然后再重新扫一遍,一旦碰到某个覆盖数为1就是这个单词的最短前缀了. 不知为何下面的程序一直有bug……不知是读入的问题? type nod ...
- CSS sprites 技术
Css Sprites 技术逐渐流行,各大网站上都可以看到它的身影. 但从本质上,Css Sprites 只是 Css 技术的一个使用小窍门,初学者也能快速上手. Css Sprites 简单解释: ...
- ORACLE SQLloader详细语法
Oracle SQL Loader的详细语法 SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件迁移到ORACLE数据库中.SQL*LOADER是大型数据 ...