(系列七).net8 Aop切面程式設計

陈逸子风發表於2024-10-16

說明

該文章是屬於OverallAuth2.0系列文章,每週更新一篇該系列文章(從0到1完成系統開發)。

該系統文章,我會盡量說的非常詳細,做到不管新手、老手都能看懂。

說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+視覺化流程管理系統。

友情提醒:本篇文章是屬於系列文章,看該文章前,建議先看之前文章,可以更好理解專案結構。

有興趣的朋友,請關注我吧(*^▽^*)。

關注我,學不會你來打我

什麼是Aop切面程式設計

俗話說:沒有使用Aop的系統都不是好系統。

那麼aop到底是什麼東西,人們對它的評價如此之高。

Aop是Aspect Oriented Programming的縮寫,意思是“面向切面程式設計”。

從字面意思上理解就是把一個功能塊切成很多面。

列如:

我有10個獲取資料的介面,隨著程式碼的不斷迭代,現如今想做以下2個操作。

1、現在對這10個介面做一個【效能監控】,監控這10個介面的呼叫時間。你會怎麼做?

2、對這10個介面做一個【呼叫監控】,檢視呼叫人、呼叫時間、傳入引數、返回資料等記錄。你會怎麼做?

有人說,在每個介面中加一點監控程式碼。

也有人說,寫一個監控方法,在介面中呼叫該方法。

但這都不是好的選擇,它不僅工作量大、耦合性高,還容易造成錯誤,不易維護。

為了解決這種困難,aop誕生了。它在不修改介面原有邏輯的情況下,把介面切分為多個邏輯單元。

它很好的降低了這方面的耦合性,提高了程式碼的靈活性和可擴充套件性。

它目前的主要作用有:日誌記錄、安全控制、異常處理、事務處理、安全控制等功能。

.net8 中Aop的運用

首先說下:本篇Aop的運用是結合Autofac一起使用,如果對Autofac太不明白,請移步從0到1搭建許可權管理系統系列四 .net8 中Autofac的使用

安裝:Castle.DynamicProxy(選擇最新)、Autofac.Extras.DynamicProxy(選擇最新,最新的這個好像是包含了Castle.DynamicProxy)

編寫Aop外掛(AopPlugIn),程式碼如下

/// <summary>
/// aop外掛
/// </summary>
public class AopPlugIn : IInterceptor
{
    /// <summary>
    /// 攔截
    /// </summary>
    /// <param name="invocation"></param>
    public void Intercept(IInvocation invocation)
    {
        //當前呼叫方法名稱
        var methodName = invocation.Method.Name;

        //當前呼叫方法所在服務名稱
        var interfaceServiceName = "I" + invocation.TargetType.Name;

        //獲取當前呼叫的方法資訊
        var methodInfo = invocation.Method;

        //當前方法引數數量
        var methodParameterCount = methodInfo.GetParameters().Length;

        // 當前介面所有引數
        foreach (var parameter in methodInfo.GetParameters())
        {
            //引數名稱
            var ParameterName = parameter.Name;
            //引數值
            var ParameterValue = invocation.Arguments[parameter.Position];
            //引數型別
            var ParameterType = invocation.Arguments[parameter.Position] == null ? string.Empty : invocation.Arguments[parameter.Position].GetType().Name;
        }

        /*
         你可以在方法執行前,編寫任何邏輯
         */

        //執行呼叫方法
        invocation.Proceed();

        /*
         你可以在方法執行後,編寫任何邏輯
         */

        //當前介面返回值
        var value = invocation.ReturnValue;
    }
}

程式碼解釋:該外掛相當於一個攔截器,只要被Autofac註冊的服務並且要求攔截,那麼該服務下的所有介面都會進入攔截器中。

Intercept():在該aop中方法中可以獲取當前呼叫介面的名稱、服務名稱、引數、返回值等

invocation.Proceed():執行當前呼叫的介面。在該方法前後做一些邏輯操作,如日誌、效能監控、異常監控等。

在Autofac中新增Aop整合服務

如果對Autofac太不明白,請移步從0到1搭建許可權管理系統系列四 .net8 中Autofac的使用

編寫好aop的外掛後,我們需要把aop外掛整合到Autofac中,配合完成介面的攔截。程式碼如下

/// <summary>
/// Autofac外掛
/// </summary>
public class AutofacPlugIn : Autofac.Module
{
    /// <summary>
    /// 重寫Autofac的Load方法
    /// </summary>
    /// <param name="containerBuilder"></param>
    protected override void Load(ContainerBuilder containerBuilder)
    {
        //服務專案程式集
        Assembly service = Assembly.Load("DomainService");
        Assembly intracface = Assembly.Load("Infrastructure");

        //註冊aop
        containerBuilder.RegisterType(typeof(AopPlugIn));

        //專案必須以xxx結尾
        containerBuilder.RegisterAssemblyTypes(service).Where(n => n.Name.EndsWith("Service") && !n.IsAbstract)
            .InstancePerLifetimeScope().AsImplementedInterfaces().InterceptedBy(typeof(AopPlugIn)).EnableInterfaceInterceptors();
        containerBuilder.RegisterAssemblyTypes(intracface).Where(n => n.Name.EndsWith("Repository") && !n.IsAbstract)
           .InstancePerLifetimeScope().AsImplementedInterfaces();
    }
}

程式碼解釋:containerBuilder.RegisterType(typeof(AopPlugIn));必須要先註冊aop,然後透過InterceptedBy(typeof(AopPlugIn)).EnableInterfaceInterceptors()整合到Autofac中。

這裡要注意下,我們可以在後面新增where條件,來確定哪些介面需要攔截。如果不新增,那麼就會攔截Autofac中所有的介面

測試

aop的使用,其實就是一個攔截器,攔截被autofac注入的服務介面,所以配置非常簡單,當然所有的技術都不是完美的,要看系統進行選擇。

執行之前我們搭建好的介面

執行:查詢所有使用者介面GetAllUser()

可以看到,該介面被成功攔截。我們可以自由的在方法前後,新增業務邏輯,它不會改變原有介面邏輯。

以上是一些介面的基本資訊,及返回值,當然我們可以獲取更多介面的資訊。

有了這些資訊後,我們就可以做很多邏輯操作,比如之前說的:日誌記錄、效能監控、呼叫監控、異常資訊、事務處理等。

以上就是全域性異常捕獲機制,感興趣的可以下載專案,修改吧。

原始碼地址:https://gitee.com/yangguangchenjie/overall-auth2.0-web-api

預覽地址:http://139.155.137.144:8880/swagger/index.html

幫我Star,謝謝。

有興趣的朋友,請關注我微信公眾號吧(*^▽^*)。

關注我:一個全棧多端的寶藏博主,定時分享技術文章,不定時分享開源專案。關注我,帶你認識不一樣的程式世界

相關文章