最近對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接收。
整體而言,這個框架還是挺簡單的