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接收。
整体而言,这个框架还是挺简单的