/// <summary> /// 获取Api函数列表 /// </summary> /// <returns></returns> public virtual IEnumerable <ApplicationServiceApiMethodInfo> GetApiMethods() { var typeInfo = GetType().GetTypeInfo(); var methods = typeInfo.GetMethods( BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance); foreach (var method in methods) { if (method.IsSpecialName) { continue; } if (method.ReturnType == typeof(void)) { continue; } // 创建函数委托 // 如果函数未标记[UnitOfWork]则手动包装该函数 var action = this.BuildActionDelegate(method); if (method.GetCustomAttribute <UnitOfWorkAttribute>() == null) { action = new UnitOfWorkAttribute().Filter(action); } // 包装过滤器 var filterAttributes = method.GetCustomAttributes <ActionFilterAttribute>(); foreach (var filterAttribute in filterAttributes) { action = filterAttribute.Filter(action); } // 请求时自动设置当前的Api信息 ApplicationServiceApiMethodInfo info = null; var innerAction = action; action = () => { Context.SetApiMethodInfo(info); return(innerAction()); }; // 返回函数信息 info = new ApplicationServiceApiMethodInfo( method.ReturnType, method.Name, $"{UrlBase}/{method.Name}", method.FastGetCustomAttributes(typeof(Attribute), true).OfType <Attribute>(), method.GetParameters().Select(p => new ApplicationServiceApiParameterInfo( p.ParameterType, p.Name, p.GetCustomAttributes(typeof(Attribute), true).OfType <Attribute>())), action); yield return(info); } }
/// <summary> /// 设置当前的Api函数信息 /// </summary> public static void SetApiMethodInfo(this IHttpContext context, ApplicationServiceApiMethodInfo info) { context.Items[typeof(ApplicationServiceApiMethodInfo)] = info; }