.NET 通過 Autofac 和 DynamicProxy 實現AOP

来源:http://www.cnblogs.com/stulzq/archive/2017/05/20/6880394.html
-Advertisement-
Play Games

什麼是AOP?引用百度百科:AOP為Aspect Oriented Programming的縮寫,意為:面向切麵編程,通過預編譯方式和運行期動態代理實現程式功能的統一維護的一種技術。實現AOP主要由兩種方式,一種是編譯時靜態植入,優點是效率高,缺點是缺乏靈活性,.net下postsharp為代表者( ...


  什麼是AOP?引用百度百科:AOP為Aspect Oriented Programming的縮寫,意為:面向切麵編程,通過預編譯方式和運行期動態代理實現程式功能的統一維護的一種技術。實現AOP主要由兩種方式,一種是編譯時靜態植入,優點是效率高,缺點是缺乏靈活性,.net下postsharp為代表者(這個是收費的)。另一種方式是動態代理,優缺點與前者相反,動態為目標類型創建代理,通過代理調用實現攔截。AOP能做什麼,常見的用例是事務處理、日誌記錄等等。下麵就講講Autofac怎麼實現AOP,Autofac是一個.net下非常優秀,性能非常好的IOC容器(.net下效率最高的容器),加上AOP簡直是如虎添翼。Autofac的AOP是通過Castle(也是一個容器)項目的核心部分實現的,名為Autofac.Extras.DynamicProxy,顧名思義,其實現方式為動態代理。

  使用前的準備:

    通過Nuge安裝程式包 :Autofac、Autofac.Extras.DynamicProxy,安裝成功之後會增加三個引用

    

  下麵正式開始了!

 

  第一步:創建攔截器

  下麵是一個簡單的攔截器示例,該攔截器的功能是顯示被攔截的方法名稱、參數列表和返回結果

  

 1  /// <summary>
 2     /// 攔截器 需要實現 IInterceptor介面 Intercept方法
 3     /// </summary>
 4     public class CallLogger: IInterceptor
 5     {
 6         TextWriter _output;
 7 
 8         public CallLogger(TextWriter output)
 9         {
10             _output = output;
11         }
12 
13         /// <summary>
14         /// 攔截方法 列印被攔截的方法執行前的名稱、參數和方法執行後的 返回結果
15         /// </summary>
16         /// <param name="invocation">包含被攔截方法的信息</param>
17         public void Intercept(IInvocation invocation)
18         {
19             
20             _output.WriteLine("你正在調用方法 \"{0}\"  參數是 {1}... ",
21               invocation.Method.Name,
22               string.Join(", ", invocation.Arguments.Select(a => (a ?? "").ToString()).ToArray()));
23 
24             //在被攔截的方法執行完畢後 繼續執行
25             invocation.Proceed();
26 
27             _output.WriteLine("方法執行完畢,返回結果:{0}", invocation.ReturnValue);
28         }
29     }

 

  第二步:註冊攔截器到Autofac容器

  攔截器必須註冊到Aufofac容器中,可以通過攔截器類型或者命名註入,這兩種方式會讓使用攔截器的方法有所不同(後面會講到)。

  

1             // 命名註入
2             builder.Register(c => new CallLogger(Console.Out))
3                    .Named<IInterceptor>("log-calls");
4 
5             // 類型註入
6             builder.Register(c => new CallLogger(Console.Out));    

  第三步:啟用攔截器

  啟用攔截器主要有兩個方法:EnableInterfaceInterceptors(),EnableClassInterceptors()。

  EnableInterfaceInterceptors方法會動態創建一個介面代理

  EnableClassInterceptors方法會創建一個目標類的子類代理類,這裡需要註意的是只會攔截虛方法,重寫方法

  啟用攔截器示例代碼:

  

            //啟用類代理攔截
            builder.RegisterType<Circle>().EnableClassInterceptors();
            //啟用介面代理攔截
            builder.RegisterType<Circle>().EnableInterfaceInterceptors();

  第四步:指明要攔截的類型

  有兩種方法:

    第一種:給類型加上特性Attribute

    

    第二種:在註冊類型到容器的時候動態註入攔截器

    

1             //動態註入攔截器CallLogger
2             builder.RegisterType<Circle>().InterceptedBy(typeof(CallLogger)).EnableClassInterceptors();

  第五步:測試效果了

    1.類代理攔截

    

    Circle類代碼:

    

     2.介面代理攔截

    

     IShape介面代碼:

    

1 public interface IShape
2     {
3         /// <summary>
4         /// 形狀的面積
5         /// </summary>
6         void Area();
7 
8     }

    Circle類代碼:

    

1 public class Circle:IShape
2     {
3         //重寫父類抽象方法
4         public void Area()
5         {
6             Console.WriteLine("你正在調用圓求面積的方法");
7         }
8     }

 

    如果有什麼地方寫得不對歡迎批評改正,如果有什麼疑問,歡迎提問。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 考慮到 Raspberry Pi 讀取模擬信號是很煩人的事情,更何況是在沒人玩的 Windows 10 IoT 下,所以準備正兒八經的寫點東西。 需求:使用 Raspberry Pi 讀取輸出模擬信號的 MQ 系列氣體感測器。(GitHub:https://github.com/ZhangGaoxi ...
  • 上節談了談Netop.Core的對於應用系統的配置信息的處理,對於Netop.Core最核心的服務--類工廠/對象查找服務當然要用到配置服務,等下會說到。 對於NET類工廠/對象查找服務,名氣大的有Spring.Net(對應於Java的Spring--號稱輕量級中間件),為什麼還要再造一個輪子呢?如 ...
  • 先把Netop.Core的最核心部分“對象查找服務”放一放,先說說應用系統的配置。 一個應用系統的配置是少不了的,除非你是一個純硬代碼族頑固者。 也見過有的應用系統通過系統提供的健值(key-value)方法在appSettings節點下設了幾十個甚至上百個,不堪入目,更別說條理性了。 開發一個應用 ...
  • Netop.Core是我程式開發積累的一個輕量級的.NET對象查找服務和AOP開發框架,現將源碼公開,共用給各位NET程式員後面相關的文章對這個開發框架進行程式解說和使用解說. Netop.Core--輕量級的.NET對象查找服務和AOP開發框架概述:1. 對象查找服務(本地服務實例生成,遠程服務, ...
  • 今天是個好日子,伴著早上八點的朝陽,我背上書包,提上電腦,帶上一根網線,風風火火的沖向教室,因為,我終於想好博客內容寫啥了——這不是快期末了麽,我就寫複習,雖然有些課程還沒講完,但並不影響我做複習,正好,還能把之前沒學懂的東西揪出來,趁著有網路,有老師,把它們解決掉~ (一)WEB應用基礎 (一)W ...
  • 控制器里的代碼如下: private MySqlDbHelper msh = new MySqlDbHelper(); public ActionResult Index() { string sql = "select * from deviceType"; DataTable dt = msh. ...
  • 作為C 新手中的一員,我剛開始接觸特性時,那真是一臉冏逼啊,怎麼想怎麼查資料都沒弄明白它到底是個什麼東西,有的入門教程甚至都沒講特性和反射這些概念!相信很多人第一次接觸到特性就是關於系列化的知識了。 官方概述: 特性提供功能強大的方法,用以將元數據或聲明信息與代碼(程式集、類型、方法、屬性等)相關聯 ...
  • Newtonsoft.Json.Net20.dll 下載請訪問http://files.cnblogs.com/hualei/Newtonsoft.Json.Net20.rar 在.net 2.0中提取這樣的json {"name":"lily","age":23,"addr":{"city":gu ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...