Castle~动态代理实现对方法的拦截

昨天写了关于使用Castle.Windsor来实现IOC功能,今天需要写一下使用Castle实现对方法的拦截,这实事上是.net平台实现AOP编程的基础,当你可以对方法进行拦截时,你就可以动态地干很多事,如在方法执行前做权限验证,执行后到日志记录,异常处理等等,怎么样看到这里,胃口来了吧,呵呵,对于技术痴迷者来说,这是正常的,好了,说干就干!

前言:我们在开发项目时,你的项目可能已经上线运营了,内部的代码如果修改风险是很大的,这当然也不符合OCP了,你这前的代码在运营过程中已经将BUG修改完成,运行很稳定,但这时,你的BOSS要求你在方法操作之前做一下验证,这时,你怎么办?

方法1:改原来的方法,风险呀,原则呀!

这当然不是我们推荐的方法,它的风险性是可想而知的,你修改自己的代码还好,如果是修改别人写的代码,那麻烦就更大了,呵呵。

方法2:使用动态代理Castle,dynamic proxy在java中已经不是新鲜事物了,但在.net中还是比较少见的技术,实现的组件也不多

这虽然有些复杂度,但听起来不错,值得尝试,事实上在小微的orchard项目中早已经开始使用它了,功能模块的动态插拔确实需要这样一种技术。

实现:

一个用户业务类,它在运行过程中很稳定,代码如下:

 1    public interface IUserBLL
 2     {
 3         void GetUser(string pre);
 4     }
 5
 6     public class UserBLL : IUserBLL
 7     {
 8         public virtual void GetUser(string pre)
 9         {
10             Console.WriteLine(pre + ",GSpring");
11         }
12
13     }

但在项目二期工程中,BOSS要求在这个GetUser 方法执行之前,要验证一个用户的权限,如果满足要求才能被用户列表,这时,我们有了castle

就可以不修改上面的代码了(注意要被代理的方法必须是virtual虚方法,因为它会被代理类重写(override)的,呵呵 )。

为GetUser方法加权限了,代码如下:

 1  /// <summary>
 2     /// Summary description for DaoProxy.
 3     /// </summary>
 4     public class UserRoleInterceptorProxy : IInterceptor
 5     {
 6         string _arg;
 7         public UserRoleInterceptorProxy(string arg)
 8         {
 9             _arg = arg;
10         }
11         public void Intercept(IInvocation invocation)
12         {
13             //这里可以进行数据库连接、日志、异常处理、权限判断等共通操作
14             //Console.WriteLine("{0}方法调用之前", _arg);
15             //invocation.Proceed();//处理被代理的部分
16             //Console.WriteLine("{0}方法调用之后", _arg);
17             if (_arg == "zzl") //这里可以写你的验证逻辑
18                 invocation.Proceed();//处理被代理的部分
19             else
20                 Console.WriteLine("{0}您没有操作的权限", _arg);
21
22         }
23
24     }

在使用GetUser方法的地方,要被重写为:

1        #region Dynamic Proxy
2             var proxyGenerator = new ProxyGenerator();
3             var handler = new UserRoleInterceptorProxy[] { new UserRoleInterceptorProxy("zhz") };
4             IUserBLL iRole = proxyGenerator.CreateClassProxy<UserBLL>(handler);
5             iRole.GetUser("zzl");
6           #endregion

程序运行的结果为:

恩,这个技术有点意思,我将会在后面的文章中对动态代码进行一个封装,让大家调用起来更方便!

感谢阅读!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:Castle~动态代理实现对方法的拦截,如需转载请自行联系原博主。

时间: 2024-09-03 03:13:20

Castle~动态代理实现对方法的拦截的相关文章

【设计模式】【动态代理,在方法前和方法后加事务,AOP】

/** * Description: * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a> * <br/>Copyright (C), 2001-2010, Yeeku.H.Lee * <br/>This program is protected by copyright laws. * <br/>Program Name: * <br/>Da

java实现动态代理方法浅析_java

一些Java项目中在mybatis与spring整合中有MapperScannerConfigurer的使用,该类通过反向代理自动生成基于接口的动态代理类. 有鉴于此,本文浅析了java的动态代理. 本文使用动态代理模拟处理事务的拦截器. 接口: public interface UserService { public void addUser(); public void removeUser(); public void searchUser(); } 实现类: public class

设计模式之动态代理(dynamic proxy)

1 动态代理与静态代理 我们从上一篇设计模式之代理模式一文中已经知道,在代理模式中代理对象和被代理对象一般实现相同的接口,调用者与代理对象进行交互.代理的存在对于调用者来说是透明的,调用者看到的只是接口.这就是传统的代理模式静态代理的特点. 那么传统的静态代理模式有什么问题呢?如果需要代理的类只有一个,那么静态代理没什么问题,如果有很多类需要代理呢,用静态代理的话就需要为每一个类创建一个代理类,显然这么做太过繁琐也容易出错.为此,JDK 5引入的动态代理机制,允许开发人员在运行时刻动态的创建出代

Java 反射之动态代理

利用Java反射机制你可以在运行期动态的创建接口的实现.java.lang.reflect.Proxy类就可以实现这一功能.这个类的名字(译者注:Proxy意思为代理)就是为什么把动态接口实现叫做动态代理.动态的代理的用途十分广泛,比如数据库连接和事物管理(transaction management)还有单元测试时用到的动态mock对象以及AOP中的方法拦截功能等等都使用到了动态代理. 创建代理你可以通过使用Proxy.newProxyInstance()方法创建动态代理.newProxyIn

java中动态代理实现机制

v前言: 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务.  vJAVA各种动态代理实现的比较 v接口 interface AddInterface{ int add(int a, int b); } interface Su

动态代理解释-JDK,CGLIB,JAVASSIST,ASM

动态代理是指在运行时,动态生成代理类.代理类的字节码将在运行时生成并载入当前的ClassLoader.          生成动态代理类的方法很多,如JDK自带的动态代理.CGLIB.Javassist或者ASM库.           JDK动态代理使用简单,它内置在JDK中,因此不需要引入第三方Jar包,但相对功能比较弱.CGLIB和Javassist都是高级的字节码生成库,总体性能比JDK自带的动态代理好,而且功能十分强大.ASM是低级的字节码生成工具,使用ASM已经近乎在于使用Javab

Java Reflection(十一):动态代理

原文地址作者: Jakob Jenkov 译者:叶文海(yewenhai@gmail.com) 内容索引创建代理InvocationHandler接口 常见用例 数据库连接以及事物管理 单元测试中的动态Mock对象 自定义工厂与依赖注入(DI)容器之间的适配器 类似AOP的方法拦截器 利用Java反射机制你可以在运行期动态的创建接口的实现.java.lang.reflect.Proxy类就可以实现这一功能.这个类的名字(译者注:Proxy意思为代理)就是为什么把动态接口实现叫做动态代理.动态的代

详解java中动态代理实现机制_java

代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务. JAVA各种动态代理实现的比较 接口 interface AddInterface{ int add(int a, int b); } interface SubInterfa

关于java中的静态代理和动态代理的疑问

问题描述 本人java还未入门者,看到java的反射这一块,里面介绍java的静态代理和动态代理,看的一知半解,有点没想明白的是,动态代理相对于静态代理到底有哪些优势,使用反射机制生成动态代理类,能实现的功能,用静态代理类也可以实现.动态代理不需要写代理类,但是需要写InvocationHandler类,以我的观点看,使用动态代理反而使代码更加难以理解.还请各位大侠给以指点,不胜感激! 解决方案 说一下我对这个问题的看法吧.代理应用的情况有以下几种: 访问控制 远程访问 加载开销比较大的资源(加