示例#1
0
        /// <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;
 }