带你学习AOP框架之Aspect.Core[1]
在軟件業(yè),AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預(yù)編譯方式和運(yùn)行期動態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。AOP是OOP的延續(xù),是軟件開發(fā)中的一個(gè)熱點(diǎn),是函數(shù)式編程的一種衍生范型。利用AOP可以對業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高了開發(fā)的效率。
在.NET Core中比較好的AOP框架有一個(gè)叫做Aspect的這樣的一個(gè)框架, 它是一個(gè)國產(chǎn)的!如何引入AspectCore??可以直接nuget。
這AspectCore中需要創(chuàng)建一個(gè)攔截器一般繼承自 AbstractInterceptorAttribute。并且實(shí)現(xiàn)它的 Invoke 方法 。
其中第一個(gè)參數(shù)是上下文,next是執(zhí)行的委托方法,通過這個(gè)委托可以執(zhí)行被攔截的方法。
首先我們可以創(chuàng)建一個(gè)需要被代理攔截的類(必須是public方法是虛方法且被標(biāo)記,也必須使用MVC中的Filter命名規(guī)范)。這個(gè)方法也可以是異步的!
如何進(jìn)行代理? 需要通過ProxyGeneratorBuilder 來代理對象,注意 p 指向的對象是 AspectCore 生成的 Person 的動態(tài)子類的對象,直接 new Person是無法被攔截的。
?上面說到我們不可以直接new這個(gè)person,那現(xiàn)在我們調(diào)試一下,一探究竟!!!我們看看這個(gè)p是個(gè)什么類型。
噫?為什么這個(gè)p不是AspectPollyIdn.Person?而是AspectCore.DynamicGenerated.Person?不妨把這個(gè)p的父類給打印出來,來瞅瞅。
現(xiàn)在的對象是我們了,也就是它的父類,那這個(gè)時(shí)候你就絕對要明白了,為什么我們的被代理類是虛方法,也就是說它用子類類重寫了我們被代理類的虛方法,也就實(shí)現(xiàn)了AOP,那么呢這也就是Aspect.Core的原理。大概簡單的就是這樣。
現(xiàn)在你已經(jīng)了解了AspectCore的原理了,但回頭發(fā)現(xiàn)每次來創(chuàng)建這些對象都非常繁瑣,我們只想去使用AspectCore通過CreateClassProxy()來創(chuàng)建我們想要的代理對象,那么現(xiàn)在我們可以使用AspNetCore的依賴注入解決這個(gè)問題。
?首先呢,我們引用AspectCore.Extensions.DependencyInjection,這是AspectCore給我們的一個(gè)DI框架。再把Startup中的ConfigureServices進(jìn)行改造。
隨便創(chuàng)建一個(gè)類 繼承與AbstractInterceptorAttribute ,重寫方法,再添加一個(gè)Person。
在API中重載進(jìn)行依賴注入。下面我們進(jìn)行postman進(jìn)行測試,因?yàn)橐呀?jīng)關(guān)閉了瀏覽器瀏覽。
?OK,成功。
原文地址:https://www.cnblogs.com/ZaraNet/p/10308706.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的带你学习AOP框架之Aspect.Core[1]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019年1月已到,Java 8 要收费
- 下一篇: SeaweedFS在.net core下