在许多的实现AOP框架的技术中,不管是静态织入还是动态织入,关键点在于拦截方法,并在方法中加入预处理和后处理。而实现方法的拦截的一个简单办法就是 把类的实例委托给类的真实代理(RealProxy).这样以来,方法的调用都会被转换成消息(IMessage),同时该消息作为参数被送到真实代理的 Invoke方法。所以我们相应地改写Invoke方法,加入预处理和后处理也就OK了。

根据这个思路,可以给出一个简单的代码实现:
一,定义方法拦截的接口
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting.Messaging;

namespace LYG.Share.Interface
{
    public interface IInterceptor
    {
        void PreProcess(IMessage requestMSG);
        void PostProcess(IMessage requestMSG, IMessage returnMSG);
    }
}
二,真实代理的实现
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Activation;
using System.Runtime.Remoting.Services;
using LYG.Share .Interface ;

namespace LYG.Share.AOP.Proxies
{
    public abstract class AspectProxy : RealProxy, IInterceptor
    {

private MarshalByRefObject _target = null;

public AspectProxy()
            : base()
        {
        }
        public AspectProxy(Type serverType)
            : base(serverType)
        {
        }
             
        public void InitProxyTarget(MarshalByRefObject target)
        {
            this._target = target;
        }
        public override IMessage Invoke(IMessage msg)
        {
            bool useInterception = false;
            IMethodCallMessage invoke = (IMethodCallMessage)msg;

foreach (InterceptionAttribute attr in invoke.MethodBase.GetCustomAttributes(false))
            {
                if (attr != null)
                {
                    if (attr.UseInterception)
                    {
                        useInterception = true;
                        break;
                    }
                }
            }

if (useInterception)
            {
                this.PreProcess(msg);
            }

IConstructionCallMessage ctorInvoke = invoke as IConstructionCallMessage;
            if (ctorInvoke != null)
            {
                RealProxy default_proxy = RemotingServices.GetRealProxy(this._target );
                default_proxy.InitializeServerObject(ctorInvoke);
                MarshalByRefObject tp = (MarshalByRefObject)this.GetTransparentProxy();
                return EnterpriseServicesHelper.CreateConstructionReturnMessage(ctorInvoke, tp);
            }

IMethodReturnMessage returnMSG = RemotingServices.ExecuteMessage(this._target, invoke);
            if (useInterception)
            {
                this.PostProcess(msg, returnMSG);
            }
            return returnMSG;
        }

#region implemente IInterceptor
        public abstract void PreProcess(IMessage requestMSG);
        public abstract void PostProcess(IMessage requestMSG, IMessage returnMSG);
        #endregion      
    }
}
三,代理特性的实现
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting.Proxies;
using LYG.Share .Interface ;

namespace LYG.Share.AOP.Proxies
{
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false,Inherited=false)]
    public class AspectAttribute : ProxyAttribute
    {
        private Type _proxyType = null;
        public AspectAttribute(Type proxyType)
            :base()
        {
            _proxyType = proxyType;
        }
        public override MarshalByRefObject CreateInstance(Type serverType)
        {
            MarshalByRefObject mobj = base.CreateInstance(serverType);
            AspectProxy proxyInstance = (AspectProxy)Activator.CreateInstance(_proxyType, new object[] { serverType});
            proxyInstance.InitProxyTarget(mobj);
            return proxyInstance.GetTransparentProxy() as MarshalByRefObject;
        }
    }
}
四,方法拦截特性的实现
using System;
using System.Collections.Generic;
using System.Text;

namespace LYG.Share.AOP.Proxies
{
    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
    public class InterceptionAttribute:Attribute
    {
        private bool _useInterception = false;

public InterceptionAttribute(bool useInterception)
        {
            this._useInterception = useInterception;
        }

public bool UseInterception
        {
            get
            {
                return this._useInterception;
            }
        }
    }
}
五,测试用例
 public class AspectServiceProxy : AspectProxy
    {
      
        public AspectServiceProxy(Type serverType)
            : base(serverType)
        {
        }
     
        public override void PreProcess(IMessage requestMSG)
        {
          //对拦截方法的预处理          
        }
        public override void PostProcess(IMessage requestMSG, IMessage returnMSG)
        {
            //对拦截方法的后处理
        }
      
    }

[Aspect(typeof(AspectServiceProxy))]
    public class AspectServiceClass : ContextBoundObject
    {
        private int _value = 0;
        public AspectServiceClass(int value)
        {
            _value = value;
        }
        [Interception(true)]
        public int Add(int value)
        {
            _value += value;
            return _value;
        }    
      
    }

....
       AspectServiceClass asc=new AspectServiceClass(5);
       asc.Add(6);
......

总结

这个AOP框架的主要优点在于当我们要为一个已经写好的类的方法植入新的处理时,我们不需要对该类的方法实现做修改。只需要实现一个类的拦截代理(如 AspectServiceProxy),并对类加[Aspect(typeof(AspectServiceProxy))]特性,对要被拦截的方法加 [Interception(true)]特性。最重要的是被拦截的类的调用方式没有任何的改变,AspectServiceClass asc=new AspectServiceClass(5)这样的调用可能散布在系统的许多地方。如果被经过AOP改造后的类的调用方式发生改变那么就必须修改系统中每 一个调用改类的地方,这样造成的代码的变动可能不是我们所期望的,也于AOP理念的初衷是不相符合的(实现上许多的AOP框架都存在这个遗憾)。当然这个 AOP框架的缺点也是显而易见的,首先,所有要被代理的类都必须继承自ContextBoundObject,而事实上许多的类可能要实现其他的继承,一 个愚蠢的办法就是把ContextBoundObject作为系统中所有类的基类。其次,就是不能实现方法的多重拦截。

转载于:https://www.cnblogs.com/Aokoo/archive/2007/06/25/794266.html

用代理技术实现简单的AOP框架相关推荐

  1. JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架...

    1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...

  2. .NET 下基于动态代理的 AOP 框架实现揭秘

    .NET 下基于动态代理的 AOP 框架实现揭秘 Intro 之前基于 Roslyn 实现了一个简单的条件解析引擎,想了解的可以看这篇文章 基于 Roslyn 实现一个简单的条件解析引擎 执行过程中会 ...

  3. 使用PostSharp进行AOP框架设计:一个简单的原型

    AOP已经不是一个什么新名词了,在博客园使用关键字搜索可以查出n多条关于AOP的介绍,这里就不再赘述了. 在Bruce Zhang's Blog里面有很多关于AOP介绍及其在.net下实现研究,总觉得 ...

  4. spring—AOP 的动态代理技术

    AOP 的动态代理技术 常用的动态代理技术 JDK 代理 : 基于接口的动态代理技术 cglib 代理:基于父类的动态代理技术 JDK 代理 public class proxy {@Testpubl ...

  5. 技术不是越来越简单,而是框架是你的羁绊

    文/张泰峰,原文地址:https://www.cnblogs.com/ztfjs/p/7596617.html 技术是一条湍急的江流,我们或乘着自己的小船,或搭着公司的大帆,在激流中回转翻滚,旧的路途 ...

  6. 动态代理竟然如此简单!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 这篇文章我们来聊一下 Java 中的动态代理. 动态代理在 ...

  7. Dora.Interception,为.NET Core度身打造的AOP框架 [5]:轻松地实现与其他AOP框架的整合...

    这里所谓的与第三方AOP框架的整合不是说改变Dora.Interception现有的编程,而是恰好相反,即在不改变现有编程模式下采用第三方AOP框架或者自行实现的拦截机制.虽然我们默认提供基于IL E ...

  8. aop实现原理_从宏观的实现原理和设计本质入手,带你理解 AOP 框架的原理

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:FeelsChaotic juejin.im/post/5c57b2d5e51d45 ...

  9. 带你学习AOP框架之Aspect.Core[1]

    在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的 ...

最新文章

  1. b树与b+树的区别_一篇文章理清B树、B-树、B+树、B*树索引之间的区别与联系
  2. 如何高效的做机器学习项目
  3. Response.Redirect:无法在发送 HTTP 标头之后进行重定向
  4. 用Microsoft Application Center Test测试Web应用程序性能
  5. a java runtime envi_认识java
  6. 11、mybatis返回List
  7. CIFAR-10数据集可视化二进制版本
  8. HDU - 6955 Xor sum tire树 + 贪心
  9. python面试题总结(1)--语言特性
  10. 基于Alluxio系统的Spark DataFrame高效存储管理技术
  11. TokenInsight:反映区块链行业整体表现的TI指数较昨日同期上涨2.97%
  12. (转)MTK VC模拟器使用技巧
  13. LVS-三种负载均衡方式比较
  14. 10个5G应用优秀案例!工业互联网、智慧城市、智慧医疗等都在这里
  15. 房产中介管理系统,房产中介预约看房系统,看房预约系统毕设作品
  16. python opencv将图片转为灰度图
  17. VLAN端口类型(access、Trunk、Hybrid)
  18. MOGRT动态图标模板 爱情元素手绘爱心特效pr视频模板
  19. linux平台下一个好用的并行压缩工具(cpu核数越多越快,比tar -j可以快很多倍)
  20. C语言中Strcpy 的使用

热门文章

  1. 第一张信用卡,该选哪家的?
  2. Matlab与C/C++/Java的一些区别
  3. 如何避免偶然的锁存器和%0h
  4. 很好的Android论坛
  5. 手机html left 50%,left-​50%是什么意思
  6. 1 数列分块入门_线性代数入门——利用分块矩阵简化矩阵乘法运算
  7. dilink智能网联系统鸿蒙系统,【图】秦Pro DM DiLink智能网联系统实测解读_汽车江湖...
  8. php小于neq qe,PHP模板判断语句eq相等 ne、neq不相等, gt大于, lt小于
  9. linux集群管理权限,Linux下ACL权限管理
  10. Linux 终端配置