你的位置:首页 > 软件开发 > ASP.net > .Net 动态代理,AOP

.Net 动态代理,AOP

发布时间:2016-04-28 19:00:03
.Net 动态代理,AOP 直接上代码了。/***************************************** * author:jinshuai * * E-mail:redfox2008@126.com * * Date:2016-04-28 * ...

.Net 动态代理,AOP

 

 直接上代码了。

/***************************************** * author:jinshuai * * E-mail:redfox2008@126.com * * 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<get='_blank'>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; }  }}

原标题:.Net 动态代理,AOP

关键词:.NET

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。