LindAgile~緩存攔截器支持類的虛方法了

来源:http://www.cnblogs.com/lori/archive/2017/08/10/7338206.html
-Advertisement-
Play Games

寫它的原因 之前寫過一個緩存攔截器,主要在方法上添加CachingAspect特性之後,它的返回值就可以被緩存下來,下次訪問時直接從緩存中返回結果,而它有一個前提,就是你的方法需要是一個介面方法,緩存這個CachingAspect卻需要在類里定義,大叔感覺很怪,所以抽時間把它完善一下,讓緩存特性在接 ...


寫它的原因

之前寫過一個緩存攔截器,主要在方法上添加CachingAspect特性之後,它的返回值就可以被緩存下來,下次訪問時直接從緩存中返回結果,而它有一個前提,就是你的方法需要是一個介面方法,緩存這個CachingAspect卻需要在類里定義,大叔感覺很怪,所以抽時間把它完善一下,讓緩存特性在介面方法里定義。

今天說的是為類里的虛方法添加CachingAspect,這個事實上我們用的比較多,因為並不是所有方法都需要提取到介面的,只有那些可能有多態的情況才需要實現這種功能,所以大叔覺得有必要為類的虛方法添加一個緩存攔截的功能。

攔截的原理

主要是建立一個新的類,然後讓它繼承被攔截的類型,找到聲明為virtual的方法,然後去override它,我們的攔截器使用了emit實現了建立類,建立方法等功能。

  1. -》程式入口
  2. -》 建立代理
  3. -》建立新程式集
  4. -》建立新模塊
  5. -》建立新類
  6. -》繼承被攔截的類
  7. -》重寫virtual方法
  8. -》添加緩存邏輯
  9. -》返回

實例代碼

  public class AOP
    {
        [CachingAspect(CachingMethod.Get)]
        public virtual string Hello()
        {
            return DateTime.Now.ToString();
        }
    }

使用它

  var aop = ProxyFactory.CreateProxy<AOP>();
  Console.WriteLine(aop.Hello());
  Thread.Sleep(1000);
  Console.WriteLine(aop.Hello());

緩存結果存儲到了redis中間件里

修改了LindAspect的代碼段,對代理服務的完善,對類虛方法的支持!

對代理類也進行修改,添加了介面與類的判斷

         if (_interfaceType.IsInterface)//介面代理
            {
                _typeBuilder = _moduleBuilder.DefineType(string.Format(TypeNameFormat, _realProxyType.Name),
                   TypeAttributes.Public | TypeAttributes.Sealed);

                _typeBuilder.AddInterfaceImplementation(_interfaceType);
            }
            else//類代理,虛方法可以被重寫
            {
                _typeBuilder = _moduleBuilder.DefineType(string.Format(TypeNameFormat, _realProxyType.Name),
                 TypeAttributes.Public | TypeAttributes.Sealed, _interfaceType);
            }

下一步,大步將再次進行優化,爭取早日支持介面方法攔截功能,而不是把攔截特性寫在類里。

像下麵的代碼,既然用了介面,就應該把特性寫在介面方法上,您說是吧!

   public interface IAOP
    {
        [CachingAspect(CachingMethod.Get)]
        string Hello();
    }
    public class AOP2 : IAOP
    {
        public string Hello()
        {

            return DateTime.Now.ToString();
        }
    }

感謝閱讀!

請關註大叔新寵LindAgile框架!

 


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

-Advertisement-
Play Games
更多相關文章
  • 關於GIT GIT 是一個分散式版本控制軟體,最初由林納斯·托瓦茲(Linus Torvalds)創作,於2005年以GPL發佈。最初目的是為更好地管理Linux內核開發而設計。是目前世界上最先進的分散式版本控制系統. 什麼是版本控制 版本控制(Revision control)是維護工程藍圖的標準 ...
  • 一切皆對象! 預習: #仿照正方形類寫一個圓形類 class Square: def __init__(self,length_of_side): self.length_of_side = length_of_side def square(self): '面積' return self.leng ...
  • [TOC] 1. 創建並聲明一個切麵 1. 首先,創建一個類,添加 註解使其添加到IoC容器 2. 然後,添加 註解,使其成為一個切麵 3. 最後,在配置文件裡面,使用``來使其生效 2. 使用切麵的通知 切麵總共有 6 個通知類型,其中五個常用的為:前置通知、後置通知、返回通知、異常通知、環繞通知 ...
  • spring.io官方提供的例子Building a RESTful Web Service提供了用Maven、Gradle、STS構建一個RESTFul Web Service,實際上採用STS構建會更加的便捷。 STS安裝參考。 目標 在瀏覽器中輸入url: 訪問後得到結果: 可以在url中帶上 ...
  • 1, OutOfMemoryError異常 除了程式計數器外,虛擬機記憶體的其他幾個運行時區域都有發生OutOfMemoryError(OOM)異常的可能, java Heap 溢出 一般的異常信息:java.lang.OutOfMemoryError:Java heap spacess java堆用 ...
  • 直接上代碼,相信以後會用到的 ...
  • 服務端代碼: 客戶端代碼: ...
  • 物聯網(Internet of Things,IoT)最近曝光率越來越高。雖然HTTP是網頁的事實標準,不過機器之間(Machine-to-Machine,M2M)的大規模溝通需要不同的模式:之前的請求/回答(Request/Response)模式不再合適,取而代之的是發佈/訂閱(Publish/S ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...