1. 程式人生 > 實用技巧 >基於 Aspect-Injector 以及 .NET CORE 3.1 實現AOP程式設計 (一)

基於 Aspect-Injector 以及 .NET CORE 3.1 實現AOP程式設計 (一)

之前學習.NET CORE 接觸到切面程式設計這個概念,比較感興趣,怎奈工作太忙,沒時間研究,這周難得空閒一天,就試了下,在這裡分享下。

  1、什麼是AOP?

  AOP為Aspect Oriented Programming的縮寫,意為:面向切面程式設計。舉個例子,.NET MVC中的filter就是切面程式設計的一種實現,過濾器就是一個切面,哪裡需要就插到哪裡,如果不需要就拔掉即可,從而實現可插拔操作。

  2、Aspect-Injector

  Aspect Injector 是一個開源的AOP框架,支援.NET OCRE,這個框架比較輕量級,但是麻雀雖小五臟俱全,它可以滿足於大部分AOP場景:

  • 支援.NET Core
  • 支援對非同步方法注入切面
  • 能夠把切面注入到方法、屬性和事件上
  • 支援Attribute的方式注入切面

  3、實現

  首先要引入Aspect Injector,我用的是VS2019,在NuGet裡面,搜尋並安裝就可以了。

接下來就是引入名稱空間,並進行編碼了,在這我寫了兩個很簡單的示例,大家看下。這裡說明下,我看了很多教程,裡面的寫法不盡相同,應該是.NET CORE版本不同對應的Aspect Injector不同,導致寫法不同,我這邊專案的版本是.NET CORE 3.1 ,然後Aspect Injector版本是2.4.1

 1 using AspectInjector.Broker;
2 using Newtonsoft.Json; 3 using System; 4 using System.Collections.Generic; 5 using System.Diagnostics; 6 using System.Text; 7 8 namespace Y.AOP.Service 9 { 10 /// </summary> 11 /// description:基於Aspect-Injector實現AOP,執行前執行後示例 12 /// version:1.0 13 /// author:PrintY 14 /// date:2020-08-09
15 /// </summary> 16 [Aspect(Scope.Global)] 17 [Injection(typeof(LogAspect))] 18 public class LogAspect : Attribute 19 { 20 /// <summary> 21 /// 執行前 22 /// </summary> 23 /// <param name="name">方法名</param> 24 /// <param name="arguments">引數</param> 25 [Advice(Kind.Before)] 26 public void LogBefore([Argument(Source.Name)] string name, [Argument(Source.Arguments)] object[] arguments) 27 { 28 Console.WriteLine(""); 29 Console.WriteLine($"Before,呼叫方法:'{name}',呼叫引數:{JsonConvert.SerializeObject(arguments)}"); 30 } 31 32 /// <summary> 33 /// 執行後 34 /// </summary> 35 /// <param name="name">方法名</param> 36 /// <param name="arguments">引數</param> 37 /// <param name="retrrnValue">返回值</param> 38 [Advice(Kind.After)] 39 public void LogAfter([Argument(Source.Name)] string name, [Argument(Source.Arguments)] object[] arguments, [Argument(Source.ReturnValue)] object retrrnValue) 40 { 41 Console.WriteLine(""); 42 Console.WriteLine($"After,呼叫方法:'{name}',呼叫引數:{JsonConvert.SerializeObject(arguments)},返回值為:{JsonConvert.SerializeObject(retrrnValue)}"); 43 } 44 } 45 }

使用的話就很簡單了,只要是用過 ASP.NET MVC的應該都見過這個用法:

1 [LogAspect]
2 public string GetLog(string Msg = "AOP LOG 測試!")
3 {
4     return "這是" + Msg;
5 }

上面的示例很簡單,算是初識Aspect Injector,以後有更深入的瞭解再做分享。