Esempio n. 1
0
        /// <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;
            }
        }
Esempio n. 2
0
 /// <summary>
 /// 初始化模块应用程序
 /// </summary>
 /// <param name="application"></param>
 public virtual void Init(ModuleApplication application)
 {
     this.Application = application;
 }
Esempio n. 3
0
        private MethodInfo GetActionMethod(string moduleName, string providerName, string actionName, ModuleApplication currentApp)
        {
            IModuleContext module = this.RegContext.GetModuleContext(moduleName);

            currentApp.ModuleContext = module;
            currentApp.Request       = new ModuleRequest()
            {
                ModuleName   = moduleName,
                ProviderName = providerName,
                ActionName   = actionName
            };
            IModuleProvider provider = module.GetProvider(providerName);

            provider.Init(currentApp);
            currentApp.ModuleProvider = provider;

            return(module.GetActionMethod(providerName, actionName));
        }