全新升級的AOP框架Dora.Interception[匯總,共6篇]

多年之前利用IL Emit寫了一個名為Dora.Interception的AOP框架。前幾天利用Roslyn的Source Generator對自己為公司寫的一個GraphQL框架進行改造,性能得到顯著的提高,覺得類似的機制同樣可以用在AOP框架上,實驗證明這樣的實現方式不僅僅極大地改善性能(包括執行耗時和GC內存分配),而且讓很多的功能特性變得簡單了很多。這并不是說IL Emit性能不好(其實恰好相反),而是因為這樣的實現太復雜,面向IL編程比寫匯編差不多。由于AOP攔截機制涉及的場景很多(比如異步等待、泛型類型和泛型方法、按地址傳遞參數等等),希望完全利用IL Emit高效地實現所有的功能特性確實很難,但是從C#代碼的層面去考慮就簡單多了。

[1]編程體驗

除了性能的提升和保持低侵入性,Dora.Interception在編程方式上于其他所有的AOP框架都不太相同。在攔截器的定義上,我們并沒有提供接口和基類來約束攔截方法的實現,而是采用“基于約定”的編程模式將攔截器定義成一個普通的類,攔截方法上可以任意注入依賴的對象。在如何應用定義的攔截器方面,我們提供了常見的“特性標注”的編程方式將攔截器與目標類型、方法和屬性建立關聯,我們還提供了一種基于“表達式”的攔截器應用方式。Dora.Interception主張將攔截器“精準”地應用到具體的目標方法上,所以提供的這兩種方式針對攔截器的應用都是很“明確的”。如果希望更加靈活的攔截器應用方式,通過提供的擴展可以自由發揮。本章通過一個簡單實例來演示一下Dora.Interception如何使用。…

[2]基于約定的攔截器定義方式

Dora.Interception有別于其他AOP框架的最大的一個特點就是采用針對“約定”的攔截器定義方式。如果我們為攔截器定義了一個接口或者基類,那么攔截方法將失去任意注冊依賴服務的靈活性。除此之外,由于我們采用了動態代碼生成的機制,我們可以針對每一個目標方法生成對應的方法調用上下文,所以定義在攔截上下文上針對參數和返回值的提取和設置都是泛型方法,這樣可以避免無謂的裝箱和拆箱操作,進而將引入攔截帶來的性能影響降到最低。…

[3]基于特性標注的攔截器注冊方式

在Dora.Interception中按照約定方式定義的攔截器可以采用多種方式注冊到目標方法上。本篇文章介紹最常用的基于“特性標注”的攔截器注冊方式,下一篇會介紹另一種基于(Lambda)表達式的注冊方式。如果原生定義的這兩種注冊方式不能滿足要求,利用框架提供的擴展,我們可以完成任何你想要的攔截器注冊手段。…

[4]基于Lambda表達式的攔截器注冊

基于特性標注的攔截器注冊方式僅限于將攔截器應用到自己定義的類型上,對于第三方提供的類型就無能為力了。對于Dora.Interception來說,攔截器注冊本質上建立攔截器與一個或者多個目標方法之間的映射,所以最笨的方式就是利用反射的方式得到表示目標方法的MethodInfo對象,并將它與對應的攔截器關聯在一起。這種方式雖然能夠解決問題,但是編程體驗很差。本篇介紹的基于表達式的攔截器注冊方式利用針對目標方法或者屬性的調用表達式,以一種強類型的方式獲取到目標方法,極大地改善了編程體驗。…

[5]實現任意的攔截器注冊方式

Dora.Interception提供了兩種攔截器注冊方式,一種是利用標注在目標類型、屬性和方法上的InterceptorAttribute特性,另一種采用基于目標方法或者屬性的調用表達式。通過提供的擴展點,我們可以任何我們希望的攔截器注冊方式。…

[6]框架設計和實現原理

從設計模式來看,Dora.Interception采用了“職責鏈”模式。我們將應用到同一個方法的多個攔截器以及針對目標方法的調用構建成如下所示的“調用鏈”。調用鏈在執行過程中共享同一個“調用上下文”,后者提供當前調用的上下文信息,比如目標對象、調用方法、輸出參數和返回值等。每個攔截器不僅可以利用這些上下文信息執行對應的操作,還可以直接利用此上下文修改參數和返回值,并且自行決定是否繼續執行后續調用。…

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281860.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281860.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281860.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java string轉decimal_java中string轉bigdecimal的例子

小編知道在java中數據類型非常 的嚴格了,我們如果一個地方不小心就會導致應用出問題了,今天 小編就在string 轉BigDecimal上碰到了一些問題,下面整理了幾個例子大家一起來看看。例子1,string 轉BigDecimalpublic class Test{public static vo…

通過url來設置log4j的記錄級別

2019獨角獸企業重金招聘Python工程師標準>>> 直接看代碼。 import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.Level; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotati…

通過用戶模型,對數據庫進行增刪改查操作

增加:user db.session.add(user)db.session.commit() #增加 user User(username JACKSON,password0328 ) db.session.add(user) db.session.commit() 查詢:User.query.filter(User.username mis1114).first() #查詢 userUser.query.filter(User.usern…

Android OpenGL ES(七)----理解紋理與紋理過濾

1.理解紋理 OpenGL中的紋理能夠用來表示圖像。照片,甚至由一個數學算法生成的分形數據。每一個二維的紋理都由很多小的紋理元素組成。它們是小塊的數據,類似于我們前面討論過的片段和像素。要使用紋理,最經常使用的方式是直接從一個圖像文件載…

WPF 基礎控件之托盤

WPF 基礎控件之托盤控件名:NotifyIcon作者: WPFDevelopersOrg - 吳鋒|驚鏵原文鏈接: https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用大于等于.NET40。Visual Studio 2022。項目使用 MIT 開源許可協議。新建NotifyIcon自定義…

java 匿名 異常_JAVA類(內部類、匿名內部類、異常、自定義異常)

內部類package AA;public class類 {int de123;StringBuffer deenewStringBuffer();public class成員內部類{public voidff() {System.out.println("這是成員內部類方法");}}/*1.可以訪問外部類所有的成員,包括被聲明為私有(private)的;2.可以使…

ASP.NET 多環境下配置文件web.config的靈活配置---轉

注意:本功能在.Net Core中已經不可用,暫時需手動修改web.config中的信息,或者將其設置在appsettings.XXX.json中,然后再使用web.config中的環境變量來制定使用的具體appsettings文件。 轉自:https://www.cnblogs.com/h…

英語之各類人群

工作狂:workaholic 月光族:moonlight group 電燈泡:third wheel 菜鳥:newbie 夜貓子:night owl 路癡:somebody has no sense of derection 宅男宅女:homebody 時尚的潮人:trend sett…

Wget CVE-2014-4877:FTP 符號鏈接任意文件系統訪問

Wget 爆出 CVE-2014-4877 漏洞:FTP 符號鏈接任意文件系統訪問。 Package: wgetVersion: 1.15-1Severity: important Upstream fix: http://git.savannah.gnu.org/cgit/wget.git/commit/?id18b0979357ed7dc4e11d4f2b1d7e0f5932d82aa7 References&#xf…

JavaScript 學習提升

javascript 技能提升 理解閉包 閉包,官方對閉包的解釋是:一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。閉包的特點:1. 作為一個函數變量的一個引用…

Uranium UI Kit

Uranium UI Kit控件名:Uranium UI Ki作者:enisn原文鏈接: https://github.com/enisn/UraniumUI項目使用 Apache-2.0 開源許可協議。Uranium 是用于 .NET MAUI 的免費和開源 UI 工具包。它提供了一組控件和實用程序來構建現代應用程序。它建…

數據庫監控框架 oneproxy-monitor 開源了

OneProxy-Monitor 是數據庫監控的框架,通過這個框架可以快速的開發出一款數據庫的監控軟件。目前已經在這個框架下面開發出來了sql server的監控軟件oneproxy-for-sqlserver, postgresql的監控軟件oneproxy-for-postgresql。并且還可以作為協議成的調試軟…

java nio epoll_Java NIO 選擇器(Selector)的內部實現(poll epoll)

http://blog.csdn.net/hsuxu/article/details/9876983之前強調這么多關于linux內核的poll及epoll,無非是想讓大家先有個認識:Java NIO中的選擇器依賴操作系統內核的這些系統調用,我們這里只講解與linux內核相關的NIO實現,當然&…

Next.js 7發布,構建速度提升40%

Next.js團隊發布了其開源React框架的7版本。該版本的Next.js主要是改善整體的開發體驗,包括啟動速度提升57%、開發時的構建速度提升40%、改進錯誤報告和WebAssembly支持。\\Next.js是一個React框架,它的主要目標是在生產環境中提供出色的性能和良好的開發…

《Java多線程編程核心技術》讀后感(十五)

線程的狀態 線程對象在不同的運行時期有不同的狀態,狀態信息就存在與State枚舉類中。 驗證New,Runnable,Terminated new:線程實例化后還從未執行start()方法時的狀態 runnable:線程進入運行的狀態 terminated:線程被銷毀時的狀態 …

隊列(queue)

隊列(queue)和棧一樣支持push和pop兩個操作。但與棧不同的是,pop兩個操作。但與棧的不同的是,pop完成的不是取出最頂端的元素,而是最底端的元素。也就是說最初放入的元素能夠最先被取出(這種行為被叫做FIFO:First In First Out,即…

一題多解,ASP.NET Core應用啟動初始化的N種方案[上篇]

ASP.NET Core應用本質上就是一個由中間件構成的管道,承載系統將應用承載于一個托管進程中運行起來,其核心任務就是將這個管道構建起來。在ASP.NET Core的發展歷史上先后出現了三種應用承載的編程方式,而且后一種編程模式都提供了針對之前編程…

java程序猿面試問缺點怎么回答_JAVA程序員面試32問,你能回答多少題

第一,談談final, finally, finalize的區別。第二,Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口)?第三,Static Nested Class 和 In…

ExecutorService——shutdown方法和awaitTermination方法

ExecutorService的關閉shutdown和awaitTermination為接口ExecutorService定義的兩個方法,一般情況配合使用來關閉線程池。 方法簡介shutdown方法:平滑的關閉ExecutorService,當此方法被調用時,ExecutorService停止接收新的任務并且…

WPF 簡單模仿 VSCode 界面布局

WPF 簡單模仿 VSCode 界面布局本文經原作者授權以原創方式二次分享,歡迎轉載、分享。WPF 簡單模仿 VSCode 界面布局作者:弈虎-呂女士會翻墻原文鏈接: https://github.com/Chen-Lin-Zhao-Wei/WPFLikeVSCode分享一篇群友這幾天自己寫的 WPF 簡…