
用動态代理可以做AOP(面向切面程式設計),進行無入侵式實作自己的擴充業務,調用者和被調用者之間的解耦,提高代碼的靈活性和可擴充性,比如:日志記錄、性能統計、安全控制、事務處理、異常處理等等。本方式實作思路用的.NET Core原生的DispatchProxy類,再加《特性标記》+《Handle接口》達到無入侵式擴充
用動态代理可以做AOP(面向切面程式設計),進行無入侵式實作自己的擴充業務,調用者和被調用者之間的解耦,提高代碼的靈活性和可擴充性,比如:日志記錄、性能統計、安全控制、事務處理、異常處理等等。本方式實作思路用的.NET Core原生的DispatchProxy類,再加《特性标記》+《Handle接口》達到無入侵式擴充 ,有興趣的朋友,自行改進一下,封裝成元件。
有什麼做的不好的或者建議,希望大家及時提出,幫助改進。
代碼上傳在gitee:https://gitee.com/luoxiangbao/dynamic-proxy.git
DispatchProxy我去看了一下源碼,和我設想的差不多,就是Emit類庫直接編寫IL語言,動态生成類和方法,然後在方法裡調用Invoke方法,這個時候就我們隻需要重寫Invoke方法,具體實作由我們自己管控。其性能很高,幾乎和我們寫好的C#編譯成IL沒多大差別,大家用的Autofac的AOP,我也看了一下,底層用的是Castle.Core類庫,而Castle.Core底層還是用的Emit方式實作,隻是思路不同。
便于了解我給大家貼一下源碼:
1.定義抽象DispatchProxy類的Invoke中繼資料
2.Emit類庫直接編寫IL語言,為代理類添加調用Invoke方法代碼
IL是.NET架構中間語言(Intermediate Language),編譯器可以直接将源程式編譯為.exe或.dll檔案,而CLR(公共語言運作時)執行的是IL語言,不是C#進階程式設計語言,IL代碼是一種近似于指令式的代碼語言,與彙編語言比較相近,給大家做個案例對比一下。
C#代碼:
IL代碼:
有興趣的朋友自己也可以去實作。接下來進入正題,我們怎麼利用DispatchProxy自己造輪子!!!
核心類就是,DispatchProxy。這是.NET core 原生的。會幫我們建立一個代理類
這個接口定義:執行之前、執行之後兩個方法。用來實作具體業務邏輯的處理
1.用來标記類具體使用哪個handle的實作來處理業務。
2. 特性定義Type屬性決定建立代理類的時候,具體使用哪個handle實作
這裡就是來組裝代理類與handle實作的地方。
1.拿到具體類,擷取Type,擷取我們上面定義的特性,通過特性的屬性,用來建立handle執行個體
2.ServiceHelp是我定義的一個來擷取執行個體化的容器幫助類。這個用.NET CORE 原始的IOC。大家可替換成autofac
3.建立化代理執行個體,把執行個體和handle實作的具體方法:AfterAction、BeforeAction傳入。用于代理類執行的時候,進行真正的調用
這裡大家可自行發揮
定義實作,并且在類上加上,AOP交給哪個handle
1.建立容器,把我們自己的業務實作都注冊好
2.通過工廠進行,動态建立代理執行個體
大家可直接通路我的,gitee
https://gitee.com/luoxiangbao/dynamic-proxy.git