/// <summary>
        /// 获取Api行为的特性过滤器     
        /// </summary>
        /// <param name="action">Api行为</param>
        /// <returns></returns>
        private static IEnumerable<IFilter> GetActionFiltersNoCached(ApiAction action)
        {
            var methodAttributes = action.GetMethodFilterAttributes();

            var classAttributes = action.GetClassFilterAttributes()
                .Where(filter => filter.AllowMultiple || methodAttributes.Any(mFilter => mFilter.TypeId == filter.TypeId) == false);

            var methodFilters = methodAttributes.Select(fiter => new
            {
                Filter = fiter,
                Level = (fiter is IAuthorizationFilter) ? FilterLevels.Authorization : FilterLevels.Method
            });

            var classFilters = classAttributes.Select(fiter => new
            {
                Filter = fiter,
                Level = (fiter is IAuthorizationFilter) ? FilterLevels.Authorization : FilterLevels.Class
            });

            var filters = classFilters.Concat(methodFilters)
                .OrderBy(filter => filter.Level)
                .ThenBy(filter => filter.Filter.Order)
                .Select(filter => filter.Filter);

            return filters;
        }
Exemplo n.º 2
0
        /// <summary>
        /// Get属性
        /// </summary>
        /// <param name="property">属性</param>
        public LnProperty(PropertyInfo property)
        {
            this.Name = property.Name;
            this.PropertyType = property.PropertyType;
            this.IsString = property.PropertyType == typeof(string);

            this.SortType = GetLnSortType(property.PropertyType);
            this.geter = new ApiAction(property.GetGetMethod());
            this.seter = new ApiAction(property.GetSetMethod());
        }
        /// <summary>
        /// 获取服务行为的特性过滤器   
        /// 并进行属性注入
        /// </summary>
        /// <param name="fastAction">服务行为</param>
        /// <returns></returns>
        public override IEnumerable<IFilter> GetActionFilters(ApiAction fastAction)
        {
            var filters = base.GetActionFilters(fastAction);
            var lifetimeScope = this.dependencyResolver.CurrentLifetimeScope;

            if (lifetimeScope == null)
            {
                return filters;
            }
            return filters.Select(filter => lifetimeScope.InjectProperties(filter));
        }
        /// <summary>
        /// 获取服务行为的特性过滤器   
        /// 并进行属性注入
        /// </summary>
        /// <param name="apiAction">服务行为</param>
        /// <returns></returns>
        public IEnumerable<IFilter> GetActionFilters(ApiAction action)
        {
            var methodFilters = action.GetMethodFilterAttributes();
            var classFilters = action.GetClassFilterAttributes().Where(cf => cf.AllowMultiple || methodFilters.Any(mf => mf.TypeId == cf.TypeId) == false);
            var filters = methodFilters.Concat(classFilters).OrderBy(f => f.Order);

            var lifetimeScope = this.dependencyResolver.CurrentLifetimeScope;
            if (lifetimeScope == null)
            {
                return filters;
            }
            return filters.Select(f => lifetimeScope.InjectProperties(f));
        }
Exemplo n.º 5
0
        /// <summary>
        /// 添加Api行为
        /// </summary>
        /// <param name="apiAction">Api行为</param>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="ArgumentException"></exception>
        public void Add(ApiAction apiAction)
        {
            if (apiAction == null)
            {
                throw new ArgumentNullException("apiAction");
            }

            if (this.dictionary.ContainsKey(apiAction.ApiName))
            {
                throw new ArgumentException(string.Format("Api行为{0}或其命令值已存在", apiAction.ApiName));
            }

            this.dictionary.Add(apiAction.ApiName, apiAction);
        }
 /// <summary>
 /// 获取Api行为的特性过滤器     
 /// </summary>
 /// <param name="apiAction">Api行为</param>
 /// <returns></returns>
 public virtual IEnumerable<IFilter> GetActionFilters(ApiAction apiAction)
 {
     var methodFilters = apiAction.GetMethodFilterAttributes();
     var classFilters = apiAction.GetClassFilterAttributes().Where(cf => cf.AllowMultiple || methodFilters.Any(mf => mf.TypeId == cf.TypeId) == false);
     return methodFilters.Concat(classFilters).OrderBy(f => f.Order).ToArray();
 }
Exemplo n.º 7
0
        /// <summary>
        /// 检测参数类型
        /// </summary>
        /// <param name="apiAction">Api行为</param>
        /// <exception cref="ArgumentException"></exception>
        private void CheckSelfParameterType(ApiAction apiAction)
        {
            foreach (var pType in apiAction.ParameterTypes)
            {
                if (pType.IsAbstract || pType.IsInterface)
                {
                    throw new ArgumentException(string.Format("Api{0}的参数类型不能包含抽象类或接口", apiAction.ApiName));
                }

                if (pType.IsSerializable == false)
                {
                    throw new ArgumentException(string.Format("Api{0}的参数类型必须为可序列化", apiAction.ApiName));
                }
            }
        }
Exemplo n.º 8
0
 /// <summary>
 /// Api行为上下文
 /// </summary>
 /// <param name="context">请求上下文</param>
 /// <param name="action">Api行为</param>
 public ActionContext(RequestContext context, ApiAction action)
     : base(context.Session, context.Packet, context.AllSessions)
 {
     this.Action = action;
 }
Exemplo n.º 9
0
 /// <summary>
 /// Api执行之前
 /// 在此检测parameter的输入合理性
 /// 不合理可以抛出异常
 /// </summary>
 /// <param name="action">关联的Api行为</param>
 /// <param name="parameter">参数信息</param>
 public abstract void OnExecuting(ApiAction action, ApiParameter parameter);
Exemplo n.º 10
0
 /// <summary>
 /// 获取Api行为的特性过滤器
 /// </summary>
 /// <param name="apiAction">Api行为</param>
 /// <returns></returns>
 public IEnumerable <IFilter> GetActionFilters(ApiAction apiAction)
 {
     return(this.GetActionFilters(apiAction, cached: true));
 }
Exemplo n.º 11
0
 /// <summary>
 /// Api参数
 /// </summary>
 /// <param name="instance">关联的api</param>
 /// <param name="info">参数信息</param>
 /// <param name="index">参数索引</param>
 internal ApiParameter(ApiAction instance, ParameterInfo info, int index)
 {
     this.instance = instance;
     this.Info     = info;
     this.Index    = index;
 }
 /// <summary>
 /// 获取Api行为的特性过滤器     
 /// </summary>
 /// <param name="apiAction">Api行为</param>
 /// <returns></returns>
 public virtual IEnumerable<IFilter> GetActionFilters(ApiAction apiAction)
 {
     return this.filterCached.GetOrAdd(apiAction, action => GetActionFiltersNoCached(action));
 }