/// <summary> /// 根据类型获取aop实现接口 /// </summary> /// <param name="providerType">实现接口类型</param> /// <returns></returns> IAopOperator GetOperatorProvider(Type providerType) { if (providerType == null || providerType.GetInterface(typeof(IAopOperator).FullName) == null) { return(null); } if (methodOperatorProvider == null || providerType != methodOperatorProvider.GetType()) { if (providerType == this.target.GetType()) { methodOperatorProvider = this.target as IAopOperator; } else { methodOperatorProvider = Activator.CreateInstance(providerType) as IAopOperator; } } return(methodOperatorProvider); }
/// <summary> /// 代理调用方法 /// </summary> /// <param name="msg">方法信息</param> /// <returns></returns> public override IMessage Invoke(IMessage msg) { IMethodCallMessage call = (IMethodCallMessage)msg; #region 检索AOP特性标记 AopMethodConfigAttribute methodAopAttr = null; var attrs = call.MethodBase.GetCustomAttributes(typeof(AopMethodConfigAttribute), false); if (attrs.Length > 0) { methodAopAttr = attrs[0] as AopMethodConfigAttribute; } #endregion #region 方法执行前拦截 if (methodAopAttr != null) { var provider = GetOperatorProvider(methodAopAttr.InvokingProvider); if (provider != null) { provider.Invoking(msg); } if (methodAopAttr.UseDefaultBeginAop) { this.Invoking(msg); } } #endregion #region 执行方法 IMethodReturnMessage returnMsg = null; //如果触发的是构造函数,此时target的构建还未开始 IConstructionCallMessage ctor = call as IConstructionCallMessage; if (ctor != null) { //获取最底层的默认真实代理 RealProxy default_proxy = RemotingServices.GetRealProxy(this.target); default_proxy.InitializeServerObject(ctor); MarshalByRefObject tp = (MarshalByRefObject)this.GetTransparentProxy(); //自定义的透明代理 this return(EnterpriseServicesHelper.CreateConstructionReturnMessage(ctor, tp)); } else { returnMsg = RemotingServices.ExecuteMessage(this.target, call); //将消息转化为堆栈,并执行目标方法,方法完成后,再将堆栈转化为消息 } #endregion #region 异常处理 if (returnMsg.Exception != null) { IAopOperator provider = null; if (methodAopAttr != null) { provider = GetOperatorProvider(methodAopAttr.OnExceptionProvider); } if (provider != null) { provider.OnException(msg, returnMsg.Exception); } else if ((target as IException) != null) { ((IException)target).OnException(msg, returnMsg.Exception); } else { this.OnException(msg, returnMsg.Exception); } object value = null; var methodInfo = (System.Reflection.MethodInfo)returnMsg.MethodBase; if (methodInfo.ReturnType != typeof(void) && methodAopAttr != null && methodAopAttr.ReturnExceptionDefaultValue) { value = Activator.CreateInstance(methodInfo.ReturnType, methodAopAttr.ExceptionDefaultValue); } returnMsg = new ReturnMessage(value, returnMsg.OutArgs, returnMsg.OutArgCount, returnMsg.LogicalCallContext, call); } #endregion #region 方法执行后拦截 else if (methodAopAttr != null) { var provider = GetOperatorProvider(methodAopAttr.InvokedProvider); if (provider != null) { provider.Invoked(msg, returnMsg); } if (methodAopAttr.UseDefaultEndAop) { this.Invoked(msg, returnMsg); } } #endregion return(returnMsg); }