1. 程式人生 > 實用技巧 >C# AOP的實現(利用.Net自帶的輕量級框架RealProxy)

C# AOP的實現(利用.Net自帶的輕量級框架RealProxy)

一、什麼是AOP

AOP(aspect oriented programming)面向切面程式設計,意思是面向某一個方向程式設計,和裝飾器和代理作用有點像,但是解耦成都比前邊的要好。

我們通過AOP實現日誌新增、異常處理、事務處理,訊息加工等。

C# 通過System.Runtime.Remoting.Proxies;請諒解框架來實現,其內部是利用了反射的原理。

二、RealProxy的使用

我們有一組功能:

    public interface BaseBox
    {
         void Open();
         void Close();  
    }

    
public class SmallBox:BaseBox { public void Open() { Console.WriteLine("small box open."); } public void Close() { Console.WriteLine("small box close."); } } public class BigBox : BaseBox { public void
Open() { Console.WriteLine("big box open."); } public void Close() { Console.WriteLine("big box close."); } }

因為框架限制,抽象類必須是interface型別的,不能是abstract class。

代理的實現:

 public class MyProxy<T> : RealProxy where T: BaseBox
    {

        
private readonly T _target; public MyProxy(T target) :base(typeof(T)) { _target = target; } //裝飾部分 private void PrintTime() { Console.WriteLine(DateTime.Now.ToString()); } public override IMessage Invoke(IMessage msg) { IMethodCallMessage methodCallMessage = msg as IMethodCallMessage; MethodInfo methodInfo = methodCallMessage.MethodBase as MethodInfo; try { PrintTime(); var result = methodInfo.Invoke(_target, methodCallMessage.InArgs); return new ReturnMessage(result, null, 0, methodCallMessage.LogicalCallContext, methodCallMessage); } catch (Exception ex) { return new ReturnMessage(ex, methodCallMessage); } } }

代理的使用:

    class Program
    {
        static void Main(string[] args)
        {
            BaseBox box = new BigBox() as BaseBox;
            MyProxy<BaseBox> boxProxy = new MyProxy<BaseBox>(box);

            var mbox = boxProxy.GetTransparentProxy() as BaseBox;
            mbox.Open();
            mbox.Close();

            Console.ReadLine();
        }
    }