Exemple #1
0
 /// <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);
 }
Exemple #2
0
        /// <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);
        }