什麼是面向切麵編程AOP

来源:https://www.cnblogs.com/HanJunJun-blog/archive/2019/04/03/10650509.html
-Advertisement-
Play Games

一丶前言 看過一些描述關於AOP切麵編程的文章,寫的太概念化讓人很難理解,下麵是我自己的理解,希望能幫到新人,如有錯誤歡迎指正。 二丶AOP是什麼,它的應用場景是什麼? AOP也跟IOC,OOP這些思想一樣它只是一種編程思想。Autofac、Spring.Net、Castle這些組件實現了AOP切麵 ...


一丶前言

  看過一些描述關於AOP切麵編程的文章,寫的太概念化讓人很難理解,下麵是我自己的理解,希望能幫到新人,如有錯誤歡迎指正。

二丶AOP是什麼,它的應用場景是什麼?

  AOP也跟IOC,OOP這些思想一樣它只是一種編程思想。Autofac、Spring.Net、Castle這些組件實現了AOP切麵編程思想的框架。AOP說白了就是在運行時,動態的將代碼切入到類的指定方法的指定位置上,這種思想就是面向切麵的編程思想。

如果你發現你的方法中有很多重覆的代碼就可以考慮用aop來精簡代碼了。比如說你想監控每個方法的耗時,按照傳統的方法是每個方法都加上監控代碼,如果用AOP思想去解決這個問題,就可以把監控代碼放到方法的外面去寫。

AOP思想的應用場景:

  AOP切麵緩存

  許可權認證

  錯誤處理

  調試

  日誌記錄

  性能監控

  數據持久化

  AOP事務

三丶AOP切麵執行流程

  AOP切麵有點像攔截器,不過跟攔截器有點區別。

四丶代碼例子

  這個例子開發環境使用的是.Net Core 3.0,用的AOP框架是Autofac,通過Nuget安裝Autofac.Extras.DynamicProxy組件。

  功能是AOP切麵緩存,把查詢結果緩存到Redis里,不用每次都查詢資料庫。

  使用步驟

  1.Startup中把BlogCacheAOP切麵 切入到Titan.Blog.AppService.dll下所有介面實現里。

var servicesDllFile = Path.Combine(basePath, "Titan.Blog.AppService.dll");//獲取項目絕對路徑
            var assemblysServices = Assembly.LoadFile(servicesDllFile);
            builder.RegisterAssemblyTypes(assemblysServices)
                .AsImplementedInterfaces()
                .InstancePerLifetimeScope()
                .EnableInterfaceInterceptors()
                .InterceptedBy(typeof(BlogCacheAOP));//AOP切麵緩存

 

  2.切麵公共代碼

  3.給方法標記特性,只有指定特性的方法才會執行公共代碼

        /// <summary>
        /// 獲取系統中所有的許可權
        /// </summary>
        /// <returns></returns>
        [Caching(AbsoluteExpiration = 10)]
        public async Task<List<SysRoleModuleButtonDto>> GeRoleModule()
        {
            var dto = await _iSysRoleModuleButtonRepository.QueryAsNoTracking(x => x.ModuleType == 0);//
            var roleModuleButton = dto.MapToList<SysRoleModuleButton, SysRoleModuleButtonDto>();
            if (roleModuleButton.Count > 0)
            {
                foreach (var item in roleModuleButton)
                {
                    item.SysRole = _iSysRoleRepository.QueryBySql($"select * from SysRole where SysRoleId='{item.SysRoleId}' and IsDelete!=1 and RoleStatus=1").Result.FirstOrDefault();
                    item.SysModule = _iSysModuleRepository.QueryBySql($"select * from SysModule where SysModuleId='{item.SysModuleId}' and ModuleStatus=1 and IsDelete!=1").Result.FirstOrDefault();
                }

            }
            return roleModuleButton;
        }

這個是AOP切麵緩存,它的功能是將包含CachingAttribute特性的方法的返回值緩存到Redis里,下次在訪問這個方法,會先去緩存中查詢如果有則直接跳過這個方法,直接從Redis里獲取之前緩存的結果集,如果沒有則會執行方法獲取返回值在緩存到Redis里。

以此,我們可以開發其他類似功能,比如性能監控,日誌監控,AOP事務,是不是很強大。具體代碼執行流程請下載這個項目(下麵有github地址),自己調試下上面的例子就明白了。

 

*****還有一個要註意的,我這個項目控制器和服務實現解耦了,如果沒有解耦的話,控制器直接調服務的話,AOP註冊方式和服務要做修改。

  1.Startup中AOP註冊代碼

 

            ////標記了虛方法virtual的才會進入切麵
            var assemblysModels = Assembly.Load("Titan.Blog.AppService");
            builder.RegisterAssemblyTypes(assemblysModels)
                .EnableClassInterceptors()
                .InterceptedBy(typeof(BlogCacheAOP));

 

  2.方法要加上virtual,否則進不了切麵

 

 

        /// <summary>
        /// 獲取系統中所有的許可權
        /// </summary>
        /// <returns></returns>
        [Caching(AbsoluteExpiration = 10)]
        public virtual async Task<List<SysRoleModuleButtonDto>> GeRoleModule()
        {
            var dto = await _iSysRoleModuleButtonRepository.QueryAsNoTracking(x => x.ModuleType == 0);//
            var roleModuleButton = dto.MapToList<SysRoleModuleButton, SysRoleModuleButtonDto>();
            if (roleModuleButton.Count > 0)
            {
                foreach (var item in roleModuleButton)
                {
                    item.SysRole = _iSysRoleRepository.QueryBySql($"select * from SysRole where SysRoleId='{item.SysRoleId}' and IsDelete!=1 and RoleStatus=1").Result.FirstOrDefault();
                    item.SysModule = _iSysModuleRepository.QueryBySql($"select * from SysModule where SysModuleId='{item.SysModuleId}' and ModuleStatus=1 and IsDelete!=1").Result.FirstOrDefault();
                }

            }
            return roleModuleButton;
        }

 

  3.切麵代碼不需要改動

 

四丶結語

  AOP思想實際上就是想把業務和公共的處理分開,對原有的代碼沒有一點入侵。我覺得學習一個新技術之前,先別讀那麼多概念性的東西,感覺越看越糊塗,只會對學習新技術產生恐懼和抵觸心理。我們可以先看看新技術它能解決什麼問題,實際應用場景是什麼,這對學習新技術應該是有好處的。

 

五丶Github Demo,演示地址

 

Demo 源碼地址,順便給個Star謝謝了。 

 

演示地址:http://gaobili.cn:8600/swagger/index.html

 

 加群一起學習共同進步。群號:963718093

.Net Core 開源學習交流


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

-Advertisement-
Play Games
更多相關文章
  • 簡介 C#(.NET)的object類裡面有三個關於判斷相等性的方法: public virtual bool Equals(object obj) public static bool Equals(object objA, object objB) public static bool Refe ...
  • 繼上一篇,介紹 CYQ.Data 在分散式緩存上支持高可用,詳見:CYQ.Data 對於分散式緩存Redis、MemCache高可用的改進及性能測試,本篇介紹 CYQ.Data 在對資料庫層面對分散式資料庫的主從備的高可用的及負載調度。 ...
  • .mmmm 課堂總結 .mmmm 課堂總結 通過本次的課堂學習,我瞭解了很多關於python的基礎知識。同時,相比較於之前學過的編程語言(例:java ,c/c++…)有很多相同之處,也有很多不同之處。相比較於Java,c/c++ 語言,python在語法上是比較簡單的,例如一條簡單的輸出語句,在j ...
  • 依賴屬性 暫無 附加屬性 1.在沒有控制項源碼的前提下增加控制項的屬性 2.多個控制項需要用到同一種屬性 使用附加屬性可以減少代碼量,不必為每一個控制項都增加依賴屬性 3.屬性不確定是否需要使用 在某些上下文中需要就被附加上去。比如TextBox的Grid.Row屬性,如果我們定義TextBox類時定義一個 ...
  • 原文鏈接:http://www.entityframeworktutorial.net/code-first/column-dataannotations-attribute-in-code-first.aspx Column特性,可以應用於實體的一個或者多個屬性上面,用來配置資料庫中數據表中列的列 ...
  • 原文地址:http://www.entityframeworktutorial.net/code-first/table-dataannotations-attribute-in-code-first.aspx Table特性可以應用於一個領域類上面,用來在資料庫中生成相應名稱的數據表。它重寫了EF ...
  • System.Objec時C#中所有類型的基類,也就是萬類之源。 一、值類型 值類型都繼承自System.ValueType(派生自System.Objec),繼承自System.ValueType的類型在CLR中具有特殊的行為,值類型變數直接包含它們的值。對於值類型變數,沒有單獨的堆分配或垃圾回收 ...
  • 日常編程中經常用到++i與i++,知識點雖然很小,但有時候會犯迷糊,在這裡小小的記錄一下。 ++i 即前遞增,顧名思義也就是先自增後傳值; 舉個慄子 此時i的值為6,j的值也為6。 i++即後遞增,顧名思義也就是先傳值後自增 舉個慄子 此時i的值為6,j的值為5。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...