C# AOP的實現(利用.Net自帶的輕量級框架RealProxy)
阿新 • • 發佈:2020-08-25
一、什麼是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 voidOpen() { 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(); } }