Aop开源框架KingAOP初体验

最近对AOP挺感兴趣, AOP在我理解来说就是一种编程思想和架构设计,AOP的简称叫”面向切面“编程,即在现有的代码里横向的切分开来进行相应处理。

这么说有点不太容易理解,但是实际上AOP这种编程方式离我们日常工作很相近,比如说MVC里的刷选器。理论就不多说了,度娘一搜一大把,我自己在网上搜了

一些C#相关的AOP框架,其中PostSharp是最有名且使用率较高的一个,其次就是Spring.Net。但是前者在Nuget上的版本是需要付费的(2.0)以上都要付费,

后者的使用方式个人不太喜欢。自己搜索了一圈,也在GitHub上搜索了下找到了一个比较精简的AOP框架:King Aop,项目地址是:https://github.com/AntyaDev/KingAOP

 

使用方式比较简单,如下顺序:

1、在Nuget上搜索King Aop,如图:

2、创建一个刷选器类,继承OnMethodBoundaryAspect,并重写相关的事件,如下代码:

 public class AopFilter : OnMethodBoundaryAspect
    {
        public override void OnEntry(MethodExecutionArgs args)
        {
            Console.WriteLine("call-------->AopFilter------>OnEntry");
            base.OnEntry(args);
        }

        public override void OnException(MethodExecutionArgs args)
        {
            Console.WriteLine("call-------->AopFilter------>OnException");
            base.OnException(args);
        }

        public override void OnExit(MethodExecutionArgs args)
        {
            Console.WriteLine("call-------->AopFilter------>OnExit");
            base.OnExit(args);
        }

        public override void OnSuccess(MethodExecutionArgs args)
        {
            Console.WriteLine("call-------->AopFilter------>OnSuccess");
            base.OnSuccess(args);
        }
    }

 3、创建一个类,该类的方法注册上面新建的刷选器,如下代码:

 public class SimonDemo : IDynamicMetaObjectProvider 
    {
       
        public SimonDemo()
        {
            Console.WriteLine(" Call 'SimonDemo类' - 'Constructor(构造函数)'");
        }

        public DynamicMetaObject GetMetaObject(Expression parameter)
        {
            return new AspectWeaver(parameter, this);
        }

        [AopFilter]
        public void Operate()
        {
            Console.WriteLine("Call 'SimonDemo类' - 'Operate方法' ");
        }
    }

上面的SimonDemo类需要继承IDynamicMetaObjectProvider,因为KingAOP是基于动态类型进行操作和绑定的,如不继承是不会进入到刷选器中的相应事件里。

同时,刷选器属性是限制了只能对应方法,且不包含构造函数;

4、接下来就是测试代码啦,如下

    static void Main(string[] args)
        {
            Console.WriteLine("Call Main ..");
            dynamic simon = new SimonDemo();
            simon.Operate();
            Console.WriteLine("exit Main ..");
            Console.Read();
        }

上面的代码执行后是这个样子的,如下图:

仔细看代码SimonDemo是以动态类型dynamic来接收的,我们把代码改成SimonDemo simon = new SimonDemo();后执行会怎么样?如下图:

实践后发现,如果需要用KingAop进行横向切面则必须在实例化切面的类时用动态类型dynamic接收。

整体而言,这个框架还是挺简单的

 

posted @ 2017-02-28 21:57  长沙大鹏  阅读(2323)  评论(0编辑  收藏  举报