說明
該文章是屬於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,謝謝。
有興趣的朋友,請關注我微信公眾號吧(*^▽^*)。
關注我:一個全棧多端的寶藏博主,定時分享技術文章,不定時分享開源專案。關注我,帶你認識不一樣的程式世界