.Net 動態代理,AOP 直接上代碼了。 DEMO: 也可以到我的Github上,直接獲取完整項目 https://github.com/jinshuai/DynamicProxy.NET ...
.Net 動態代理,AOP
直接上代碼了。
/***************************************** * author:jinshuai * * E-mail:[email protected] * * Date:2016-04-28 * * ***************************************/ using System; using System.Collections.Generic; using System.Runtime.Remoting; using System.Runtime.Remoting.Messaging; using System.Runtime.Remoting.Proxies; namespace DynamicProxy.Core { /// <summary> /// 代理工廠 /// </summary> /// <typeparam name="T"></typeparam> public class ProxyFactory<T> { public static T Create(T obj, Dictionary<string, DynamicAction> proxyMethods = null) { var proxy = new DynamicProxy<T>(obj) { ProxyMethods = proxyMethods }; return (T)proxy.GetTransparentProxy(); } } /// <summary> /// 動態代理類 /// </summary> /// <typeparam name="T"></typeparam> public class DynamicProxy<T> : RealProxy { private readonly T _targetInstance = default(T); public Dictionary<string, DynamicAction> ProxyMethods { get; set; } public DynamicProxy(T targetInstance) : base(typeof(T)) { _targetInstance = targetInstance; } public override IMessage Invoke(IMessage msg) { var reqMsg = msg as IMethodCallMessage; if (reqMsg == null) { return new ReturnMessage(new Exception("調用失敗!"), null); } var target = _targetInstance as MarshalByRefObject; if (target == null) { return new ReturnMessage(new Exception("調用失敗!請把目標對象 繼承自 System.MarshalByRefObject"), reqMsg); } var methodName = reqMsg.MethodName; DynamicAction actions = null; if (ProxyMethods != null && ProxyMethods.ContainsKey(methodName)) { actions = ProxyMethods[methodName]; } if (actions != null && actions.BeforeAction != null) { actions.BeforeAction(); } var result = RemotingServices.ExecuteMessage(target, reqMsg); if (actions != null && actions.AfterAction != null) { actions.AfterAction(); } return result; } } /// <summary> /// 動態代理要執行的方法 /// </summary> public class DynamicAction { /// <summary> /// 執行目標方法前執行 /// </summary> public Action BeforeAction { get; set; } /// <summary> /// 執行目標方法後執行 /// </summary> public Action AfterAction { get; set; } } }
DEMO:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using DynamicProxy.Core; namespace DynamicProxy.Demo { class Program { static void Main(string[] args) { var proxyMotheds = new Dictionary<string, DynamicAction>(); // key is Proxy's methodName, value is Actions proxyMotheds.Add("Add", new DynamicAction() { BeforeAction = new Action(() => Console.WriteLine("Before Doing....")), AfterAction = new Action(() => Console.WriteLine("After Doing....")) }); var user = new User(); //proxy for User var t = ProxyFactory<User>.Create(user, proxyMotheds); int count = 0; t.Add("Tom", 28, out count); t.SayName(); Console.WriteLine(count); Console.Read(); } } }
也可以到我的Github上,直接獲取完整項目 https://github.com/jinshuai/DynamicProxy.NET