在軟體業,AOP為Aspect Oriented Programming的縮寫,意為:面向切麵程式設計,透過預編譯方式和執行期動態代理實現程式功能的統一維護的一種技術。AOP是OOP的延續,是軟體開發中的一個熱點,是函式式程式設計的一種衍生範型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程式的可重用性,同時提高了開發的效率。
在.NET Core中比較好的AOP框架有一個叫做Aspect的這樣的一個框架, 它是一個國產的!如何引入AspectCore? 可以直接nuget。
這AspectCore中需要建立一個攔截器一般繼承自 AbstractInterceptorAttribute。並且實現它的 Invoke 方法 。
其中第一個引數是背景關係,next是執行的委託方法,透過這個委託可以執行被攔截的方法。
首先我們可以建立一個需要被代理攔截的類(必須是public方法是虛方法且被標記,也必須使用MVC中的Filter命名規範)。這個方法也可以是非同步的!
如何進行代理? 需要透過ProxyGeneratorBuilder 來代理物件,註意 p 指向的物件是 AspectCore 生成的 Person 的動態子類的物件,直接 new Person是無法被攔截的。
上面說到我們不可以直接new這個person,那現在我們除錯一下,一探究竟!!!我們看看這個p是個什麼型別。
噫?為什麼這個p不是AspectPollyIdn.Person?而是AspectCore.DynamicGenerated.Person?不妨把這個p的父類給打印出來,來瞅瞅。
現在的物件是我們了,也就是它的父類,那這個時候你就絕對要明白了,為什麼我們的被代理類是虛方法,也就是說它用子類類重寫了我們被代理類的虛方法,也就實現了AOP,那麼呢這也就是Aspect.Core的原理。大概簡單的就是這樣。
現在你已經瞭解了AspectCore的原理了,但回頭髮現每次來建立這些物件都非常繁瑣,我們只想去使用AspectCore透過CreateClassProxy()來建立我們想要的代理物件,那麼現在我們可以使用AspNetCore的依賴註入解決這個問題。
首先呢,我們取用AspectCore.Extensions.DependencyInjection,這是AspectCore給我們的一個DI框架。再把Startup中的ConfigureServices進行改造。
隨便建立一個類 繼承與AbstractInterceptorAttribute ,重寫方法,再新增一個Person。
在API中多載進行依賴註入。下麵我們進行postman進行測試,因為已經關閉了瀏覽器瀏覽。
OK,成功。
原文地址:https://www.cnblogs.com/ZaraNet/p/10308706.html