zoukankan      html  css  js  c++  java
  • 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

    程序运行的结果为:

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

    感谢阅读!

  • 相关阅读:
    支持国产共享软件
    Win CE 5.0 增加电池电量显示
    [转]C# 系统应用之鼠标模拟技术及自动操作鼠标
    自己写的 读写 ini 配置文件类
    自己写的 Readini 类
    sizeof与strlen()、递归优化题解
    Git学习资源收集汇总
    好用的Google Chrome插件
    【转】C# Socket编程(5)使用TCP Socket
    【转】C# Socket编程(4)初识Socket和数据流
  • 原文地址:https://www.cnblogs.com/lori/p/2862457.html
Copyright © 2011-2022 走看看