1. 程式人生 > >基於.net簡單實現AOP

基於.net簡單實現AOP

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Messaging;

namespace NewAopCalculator
{
    public class MyRealProxy<T>:RealProxy
    {
        private T _target;

        public MyRealProxy(T target)
            : base(typeof(T))
        {
            this._target = target;
        }

        public override IMessage Invoke(IMessage msg)
        {
            IMethodCallMessage callmessage = (IMethodCallMessage)msg;

            //方法開始
            PreProceede(callmessage);

            //呼叫真實方法
            object returnValue = callmessage.MethodBase.Invoke(this._target, callmessage.Args);

            ReturnMessage message = new ReturnMessage(returnValue, new object[0], 0, null, callmessage);

            //方法呼叫完成
            PostProceede(message);

            return message;
        }

        public void PreProceede(IMethodCallMessage msg)
        {
            //方法開始標識
            Console.WriteLine("Start...");
            //檢視呼叫的方法傳進來的引數
            Console.WriteLine("Method:" + msg.MethodName.ToString());
            for (int i = 0; i < msg.Args.Length; i++)
            {
                Console.WriteLine("{0}.The Args Is:{1}", i + 1, msg.Args[i]);
            }
        }

        public void PostProceede(ReturnMessage msg)
        {
            //方法結束標識
            Console.WriteLine("End\n");
        }

    }
}
其中, MyRealProxy<T> 是個泛型型別,泛型引數 T 是要攔截的物件的型別,MyRealProxy<T> 建構函式需要一個實現泛型引數的真實物件作為引數。 7.OK了,到了這裡,基於透明代理(TransparentProxy)/真實代理(RealProxy)的實現方法攔截就告一段落了,接下來我們來用客戶端呼叫,來看看客戶端輸出的是什麼。為解決方法再新增一個控制檯應用程式(ConsoleApplication)。命名為AOPCalculatorClient,程式碼如下: