使用.net core中的類DispatchProxy實現AOP


在軟件業,AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是軟件開發中的一個熱點,利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性。

比如說三層的調用:UI => BLL => DAL,正常來說我們會在UI層調用BLL層某個類的某個方法,然后BLL層某個類的某個方法又會調用DAL層某個類的某個方法,可以說通常情況下我們都是這么干的;如果說UI調BLL、BLL調DAL是縱向的話,那么AOP就是橫向的,AOP可以做到在調用BLL層或DAL層任意方法之前之后做一些統一的邏輯處理。

AOP的典型應用場景:日志記錄、權限驗證、異常處理、緩存等

目前,可以實現AOP的類庫也有很多,如下:

AspectCore
Unity
Castle DynamicProxy
Dora.Interception

 

但是在.net core中有DispatchProxy類(命名空間:System.Reflection),提供實例化代理對象和處理其方法調度的機制,借助它我們可以自己實現AOP,直接看示例

 

定義一個消息接口IMessage,其中有一個發送消息Send和接收消息Receive的方法定義:

    public interface IMessage
    {
        void Send(string content);
        void Receive(string content);
    }

 

定義電子郵件類EmailMessage實現消息接口IMessage,實現使用電子郵件發送和接收消息:

    public class EmailMessage : IMessage
    {
        public void Send(string content)
        {
            Console.WriteLine("Send Email:" + content);
        }
        public void Receive(string content)
        {
            Console.WriteLine("Receive Email:" + content);
        }
    }

 

定義日志攔截器LogDispatchProxy 繼承自DispatchProxy類,重寫基類Invoke方法並在目標方法調用前后加上所需業務邏輯;然后定義TargetClass屬性,該屬性是目標方法所屬類的實例

    public class LogDispatchProxy : DispatchProxy
    {
        public object TargetClass { get; set; }
        protected override object Invoke(MethodInfo targetMethod, object[] args)
        {
            Write("方法執行前");
            var result = targetMethod.Invoke(TargetClass, args);
            Write("方法執行后");
            return result;
        }

        private void Write(string content)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(content);
            Console.ResetColor();
        }
    }

 

使用:

    class Program
    {
        static void Main(string[] args)
        {
            //使用DispatchProxy類的靜態方法Create生成代理類,其中Create是個泛型方法,泛型有兩個值,第一個值必須是接口,第二個值必須是DispatchProxy的子類
            IMessage messageDispatchProxy = DispatchProxy.Create<IMessage, LogDispatchProxy>();
            //創建一個實現了IMessage接口的類的實例,並賦值給代理類的TargetClass屬性
            ((LogDispatchProxy)messageDispatchProxy).TargetClass = new EmailMessage();
            messageDispatchProxy.Send("早上好");
            Console.WriteLine("=======================================");
            messageDispatchProxy.Receive("中午好");

            Console.ReadKey();
        }
    }

 

執行結果

我的理解:通過DispatchProxy.Create創建的代理類messageDispatchProxy 就是一個LogDispatchProxy類,並且利用我們提供的的實例實現了IMessage接口,所以messageDispatchProxy可以強轉為LogDispatchProxy或IMessage

至此,我們沒有通過任何第三方類庫,自己實現了一個AOP


免責聲明!

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



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