.net core 3.1 基於Aspect-Injector實現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,以后有更深入的了解再做分享。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM