.NET 簡易方法攔截器

来源:https://www.cnblogs.com/stoneWl/archive/2018/05/23/9076531.html
-Advertisement-
Play Games

偉大的無產階級Willaim曾說過:"無論你覺得自己多麼的了不起,也永遠有人比你更強"。對,我說過!我就是william。 今天想記錄一下在項目中遇到的一個比較有意思的東西,異常攔截器(也不能完全說只是異常攔截,準確的說應該叫方法攔截),那有的人可能會說,異常攔截器不就是用Try……Catch就好了 ...


        偉大的無產階級Willaim曾說過:"無論你覺得自己多麼的了不起,也永遠有人比你更強"。對,我說過!我就是william。

       今天想記錄一下在項目中遇到的一個比較有意思的東西,異常攔截器(也不能完全說只是異常攔截,準確的說應該叫方法攔截),那有的人可能會說,異常攔截器不就是用Try……Catch就好了嗎?沒錯,Try……Catch是能攔截到異常。如果只是簡單攔截下,這種方法簡單可行。但是我們如果擴展下,所有的異常都要統一處理,如果你是架構師,你的團隊需要你提供一個公共的異常攔截處理組件,你會怎麼處理。

        其實在做這個demo之前,我也是想了很多種處理方式,例如在方法前加特性頭使用AOP的方式,這種看的比較高大上,也需要配置大量config文件,比較複雜。也不適合我的項目現狀(實則是懶,由於框架已經基本形成,採用這種方式需要改動大量的已經完成的框架代碼,而且時間緊迫),所以放棄了。開始需求給到我時,一時之間無從下手,在網上搜羅很多處理方式,但大多數都是採用AOP加特性頭。當然我也這個demo也是藉助於博客園中各位大神的經驗。站在巨人的肩膀上,我可以看得更遠!謝謝博客園的各位博主!矯情的話不多說了直接開始我的代碼之旅。

       首先我們看看效果圖,俗話說沒圖說個J8,有圖有文的才是好博文。

       

                                        (這是一張執行正常的截圖)

              

                                             (這是一張執行帶有異常的截圖)

         

                  (demo的結構圖,只是簡單的模擬)

        解釋一下工程結構圖每隔類文件的作用。其中紅框標記的是本次的重要組件,你的攔截器中需要用他中間的介面。Castle.Core我們可以在NuGet中進行安裝。

       1.【MyIntercept.cs

        這個文件就是自定義的攔截器。代碼很簡單。        

 1 using Castle.DynamicProxy; //必須的
 2 
 3 
 4 public class MyIntercept : IInterceptor //需要實現這個介面(翻譯攔截)
 5 {
 6     public void Intercept(IInvocation invocation)
 7     {
 8        Console.WriteLine("【進入攔截器】");
 9        MethodInfo method = invocation.GetConcreteMethod();//得到被攔截的方法
10             var parameter=invocation.Arguments[0].ToString();//獲取被攔截的方法參數
11             if (!invocation.MethodInvocationTarget.IsAbstract)
12             {
13                 Console.WriteLine("【被攔截的方法執行前】"+method.Name+"的參數"+ parameter);
14                
15                 try
16                 {
17                     invocation.Proceed();
18                 }
19                 catch (Exception ex)
20                 {
21 
22                     Console.WriteLine("【攔截到異常】"+ex.Message);
23                 }
24                 Console.WriteLine("【被攔截的方法執結果】"+invocation.ReturnValue);
25                
26             }
27             Console.WriteLine("【被攔截的方法執完畢】");
28         }
29     }
View Code

        2.ITestIntercept.cs

       定義一個介面,介面中定義需要實現的方法,也就是需要被攔截的方法     

1 public interface ITestIntercept
2  {
3         string Test(string p);
4 }
View Code

       3.【TestIntercept.cs

        實現上面的介面     

1  public class TestIntercept : ITestIntercept
2 {
3     public string Test(string p)
4     {
5         throw new Exception("異常了"); //演示拋出異常,攔截器是否能捕捉到異常信息
6             //return p;
7     }
8 }
View Code

      基本的異常攔截準備工作已經完畢,我們看看如何使用攔截器對方法進行攔截。

 1 using Castle.DynamicProxy; //必須的
 2 class Program
 3     {
 4         static void Main(string[] args)
 5         {
 6             MyIntercept myIntercept = new MyIntercept();//實例化攔截器
 7             ProxyGenerator proxy = new ProxyGenerator(); //實例化代理
 8             ITestIntercept intercept = proxy.CreateInterfaceProxyWithTarget<ITestIntercept>(new TestIntercept(),myIntercept);
 9             intercept.Test("william");
10             Console.ReadLine();
11         }
12     }
View Code

好了,一個簡單的方法攔截demo完成,他可以應用到很多場景,比如:許可權驗證,異常統計等等。

遺留問題,有興趣的同學可以試試:

1.如果介面中有多個方法,攔截器會全部攔截嗎?

2.ProxyGenerator,我才用的是CreateInterfaceProxyWithTarget對介面和實現類進行mapping。是否還有其他的方式進行mapping工作,例如配置文件?

3.本次demo中採用的是實現介面的方式對方法進行攔截,如果不用介面,攔截器是否會起作用。因為我發現在ProxyGenerator中有個CreateClassProxyWithTarget()函數。大家可以試試。

       

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                              


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

-Advertisement-
Play Games
更多相關文章
  • 本文所需的一些預備知識可以看這裡: http://www.cnblogs.com/cgzl/p/9010978.html 和 http://www.cnblogs.com/cgzl/p/9019314.html 本文介紹的是使用ASP.NET Core建立Richardson成熟度為2級的偽REST ...
  • 序:這是一篇發表在2003年6月刊的MSDN Magazine的文章,現在已經不能線上閱讀,只提供chm下載。講的是非同步請求處理那些事,正是我上一篇博文涉及的東西(BTW,事實上這篇雜誌闡述了那麼搞然並卵),期間有搜索到這篇文章,很受裨益。擔心MS哪麽時候不再提供下載以及本地保管不便,所以現在謄上來 ...
  • 恢復內容開始 (1)VS Code下創建含有授權功能的並且使用localdb作為資料庫的命令 dotnet new -au individual -uld --name identitySample identitySample為項目名稱 (2)創建完成以後會在項目的appsettings.json ...
  • 關於“ConnectionString 屬性尚未初始化”的問題(如下圖), 我在下麵一段代碼中發現了問題所在: 問題就出在標紅的代碼上,cnn.dispose() 釋放con對象所占用的資源,釋放後這個對象就不可用了,所以出現“ConnectionString 屬性尚未初始化”的問題,當頁面首次載入 ...
  • BitAdminCore應用索引 NET Core應用框架之BitAdminCore框架應用篇系列 一、簡介 querySuite為適應後臺快速增刪查改而自行開發的組件。 開發套件的核心思想: 1、佈局與功能分離:佈局歸佈局,功能歸功能。 2、佈局易讀性:使用行業通用佈局,能看到需要呈現的完整元素。 ...
  • using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using Syst... ...
  • 在經過了上面幾篇文章的學習這賓,本篇文章我們來學習如何在已經的功能中添加新欄位。 ...
  • 20180523更新內容 本次更新兩個內容,一是增加視頻處理功能,二是增加定時服務功能。 視頻處理 定時服務 BitAdminCore框架,用最少的代碼,實現最多的功能 本次新暫未發佈,後續有空發佈 計劃修改內容 1、人臉登錄功能需要重構,目前功能不完善。 2、QuerySuite類重構,同時支持m ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...