/// <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; }
/// <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)); }
/// <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(); }
/// <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)); } } }
/// <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; }
/// <summary> /// Api执行之前 /// 在此检测parameter的输入合理性 /// 不合理可以抛出异常 /// </summary> /// <param name="action">关联的Api行为</param> /// <param name="parameter">参数信息</param> public abstract void OnExecuting(ApiAction action, ApiParameter parameter);
/// <summary> /// 获取Api行为的特性过滤器 /// </summary> /// <param name="apiAction">Api行为</param> /// <returns></returns> public IEnumerable <IFilter> GetActionFilters(ApiAction apiAction) { return(this.GetActionFilters(apiAction, cached: true)); }
/// <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)); }