2021年12月4日 星期六

Aspect-oriented programming(AOP)

什麼是AOP?

Aspect-oriented programming(AOP)稱為面向導向程式設計,但他不是一個設計模式
這樣說很抽象,也不知道這可以應用在何處,所以這邊講幾個可以應用的情況

1.權限的檢查 (判斷是否登入)
2.執行時間 (效能分析)
3.想記錄Method傳入的參數與傳出的參數

所以這邊介紹一個AOP套件AspectInjector,以下是程式範例
using AspectInjector.Broker;
using Newtonsoft.Json;
using System;

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(GetData("1234"));
            Console.ReadLine();
        }

        [LogAspect]
        public static string GetData(string value)
        {
            return "test" + value;
        }       

    }

    [Aspect(Scope.Global)]
    [Injection(typeof(LogAspect))]
    public class LogAspect : Attribute
    {
        /// <summary>
        /// 執行前
        /// </summary>
        /// <param name="name">方法名</param>
        /// <param name="arguments">参数</param>
        [Advice(Kind.Before)]
        public void LogBefore([Argument(Source.Name)] string name, 
            [Argument(Source.Arguments)] object[] arguments)
        {
            Console.WriteLine($"Before,方法:'{name}'," +
                $"參數:{JsonConvert.SerializeObject(arguments)}");
        }

        /// <summary>
        /// 執行後
        /// </summary>
        /// <param name="name">方法名</param>
        /// <param name="arguments">参數</param>
        /// <param name="retrrnValue">返回值</param>
        [Advice(Kind.After)]
        public void LogAfter([Argument(Source.Name)] string name, 
            [Argument(Source.Arguments)] object[] arguments, 
            [Argument(Source.ReturnValue)] object retrrnValue)
        {
            Console.WriteLine($"After,方法:'{name}'," +
                $"參數:{JsonConvert.SerializeObject(arguments)}," +
                $"返回:{JsonConvert.SerializeObject(retrrnValue)}");
        }
    }
}

執行結果,呼叫這個Method會自動記錄Log是不是很方便







AOP最重要的目的就是,抽離共用邏輯,專注於商業邏輯

沒有留言:

張貼留言