博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Castle~动态代理实现对方法的拦截
阅读量:7237 次
发布时间:2019-06-29

本文共 2085 字,大约阅读时间需要 6 分钟。

昨天写了关于,今天需要写一下使用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  ///  2     /// Summary description for DaoProxy. 3     ///  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             else20                 Console.WriteLine("{0}您没有操作的权限", _arg);21 22         }23 24     }

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

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

程序运行的结果为:

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

感谢阅读!

转载地址:http://ovofm.baihongyu.com/

你可能感兴趣的文章
Java面试题必考50道(含答案)
查看>>
PDF如何转换成EPUB格式
查看>>
图片压缩
查看>>
Android Canvas 硬件加速引起的clipPath失效问题
查看>>
安装go语言环境
查看>>
Nginx 安装详解
查看>>
基于FckEditor的在线文本编辑器实战教
查看>>
centos 安装mysql+php+apache
查看>>
SharePoint 2016文档库只能创建单一文件故障
查看>>
tomcat 403错误和ls: cannot open directory '.': Permission denied
查看>>
linux下 tar解压 gz解压 bz2等各种解压文件使用方法
查看>>
Beta 答辩总结
查看>>
用工作单元(IUnitOfWork)带给我们的是什么?
查看>>
使用apidocJs快速生成在线文档
查看>>
e.Item.ItemType
查看>>
拖动无边框窗体
查看>>
Python3中的函数 大全
查看>>
BAT大厂面试流程剖析
查看>>
网络流(进阶)
查看>>
Vim使用心得——整体设置
查看>>