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接收。

整體而言,這個框架還是挺簡單的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM