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
程序运行的结果为:
恩,这个技术有点意思,我将会在后面的文章中对动态代码进行一个封装,让大家调用起来更方便!
感谢阅读!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
2012-01-16 谁说LINQ复杂查询不支持返回实名类型~复杂结果集中再使用复杂结果集