コード例 #1
0
ファイル: ModuleRuntime.cs プロジェクト: znw333/sod
        //第一个请求到来,会执行此方法 XXModuleApplication.Application_Start

        public ActionResult ExecuteAction(string moduleName, string providerName, string actionName, object[] paramters)
        {
            //注意:当前方法被多线程调用,不可以使用其它全局变量
            ModuleApplication application = (ModuleApplication)Activator.CreateInstance(CurrentAppType);

            MethodInfo action = GetActionMethod(moduleName, providerName, actionName, application);

            try
            {
                application.OnBeginRequest();
                DynamicMethodExecutor executor = new DynamicMethodExecutor(action);
                ActionResult          result   = (ActionResult)executor.Execute(application.ModuleProvider, paramters);
                result.Succeed = true;
                return(result);
            }
            catch (Exception ex)
            {
                return(new ErrorAction("调用模块方法错误", ex));
            }
            finally
            {
                application.OnEndRequest();
                application = null;
            }
        }
コード例 #2
0
ファイル: ModuleRuntime.cs プロジェクト: znw333/sod
        public ActionResult <TResult> ExecuteAction <T, TResult>(string moduleName, string providerName, string actionName, T parameter)
        {
            //注意:当前方法被多线程调用,不可以使用其它全局变量
            ModuleApplication application = (ModuleApplication)Activator.CreateInstance(CurrentAppType);

            MethodInfo action = GetActionMethod(moduleName, providerName, actionName, application);

            try
            {
                application.OnBeginRequest();

                Func <T, ActionResult <TResult> > fun
                    = (Func <T, ActionResult <TResult> >)System.Delegate.CreateDelegate(typeof(Func <T, ActionResult <TResult> >),
                                                                                        application.ModuleProvider, action);

                ActionResult <TResult> ret = fun(parameter);
                ret.Error   = null;
                ret.Succeed = true;
                return(ret);
            }
            catch (Exception ex)
            {
                return(new ActionResult <TResult>()
                {
                    Succeed = false,
                    Error = new ErrorAction("调用模块方法错误", ex)
                });
            }
            finally
            {
                application.OnEndRequest();
                application = null;
            }
        }
コード例 #3
0
ファイル: ModuleRuntime.cs プロジェクト: znw333/sod
        /// <summary>
        /// 执行模块方法调用,并将结果类型转换成指定的类型。要求目标方法的参数数量不能多于一个。
        /// </summary>
        /// <typeparam name="TResult">结果类型转换指定的类型</typeparam>
        /// <param name="moduleName">模块名称</param>
        /// <param name="providerName">模块提供程序名称</param>
        /// <param name="actionName">模块提供程序的方法</param>
        /// <param name="parameter">模块的方法的参数类,如果与目标方法的参数类型不一致,框架会尝试将此参数对象的值拷贝到目标参数对象上</param>
        /// <param name="objectMapper">两个对象之间进行属性值映射拷贝的方法,第一个参数为源对象,第二个参数为目标对象</param>
        /// <returns></returns>
        public ActionResult <TResult> ExecuteAction <TResult>(string moduleName, string providerName, string actionName, object parameter, Action <object, object> objectMapper)
            where TResult : new()
        {
            //注意:当前方法被多线程调用,不可以使用其它全局变量
            ModuleApplication application = (ModuleApplication)Activator.CreateInstance(CurrentAppType);

            MethodInfo action = GetActionMethod(moduleName, providerName, actionName, application);

            try
            {
                application.OnBeginRequest();
                //处理参数
                ParameterInfo[] paras = action.GetParameters();
                object[]        executorParas;
                if (paras.Length > 0)
                {
                    ParameterInfo pi      = paras[0];
                    object        objPara = Activator.CreateInstance(pi.ParameterType);
                    objectMapper(parameter, objPara);
                    executorParas = new object[] { objPara };
                }
                else
                {
                    executorParas = new object[] { };
                }

                DynamicMethodExecutor executor = new DynamicMethodExecutor(action);
                object result = executor.Execute(application.ModuleProvider, executorParas);

                ActionResult resultTemp = result as ActionResult;
                if (resultTemp != null)
                {
                    if (result is EmptyAction)
                    {
                        return(new ActionResult <TResult>()
                        {
                            Succeed = false,
                            Error = new ErrorAction("调用模块方法错误,目标模块方法的返回值是 EmptyAction,不符合当前方法返回值类型", null)
                        });
                    }
                    else if (result is ErrorAction)
                    {
                        return(new ActionResult <TResult>()
                        {
                            Succeed = false,
                            Error = (ErrorAction)result
                        });
                    }
                    else
                    {
                        if (typeof(TResult).IsClass)
                        {
                            TResult targetResult = new TResult();
                            objectMapper(resultTemp.ObjectResult, targetResult);
                            return(new ActionResult <TResult>()
                            {
                                Succeed = true,
                                Result = targetResult
                            });
                        }
                        else
                        {
                            return(new ActionResult <TResult>()
                            {
                                Succeed = true,
                                Result = (TResult)resultTemp.ObjectResult
                            });
                        }
                    }
                }
                else
                {
                    //可能为泛型结果类型
                    object objResult = ((IActionResult)result).ObjectResult;
                    if (typeof(TResult).IsClass)
                    {
                        TResult targetResult = new TResult();
                        objectMapper(objResult, targetResult);
                        return(new ActionResult <TResult>()
                        {
                            Succeed = true,
                            Result = targetResult
                        });
                    }
                    else
                    {
                        return(new ActionResult <TResult>()
                        {
                            Succeed = true,
                            Result = (TResult)objResult
                        });
                    }
                }
            }
            catch (Exception ex)
            {
                return(new ActionResult <TResult>()
                {
                    Succeed = false,
                    Error = new ErrorAction("调用模块方法错误,详细内容请看内存错误信息", ex)
                });
            }
            finally
            {
                application.OnEndRequest();
                application = null;
            }
        }