public virtual void ProvideFilter(FilterProviderContext context, FilterItem filterItem) { if (filterItem.Filter != null) { return; } var filter = filterItem.Descriptor.Filter; var filterFactory = filter as IFilterFactory; if (filterFactory == null) { filterItem.Filter = filter; filterItem.IsReusable = true; } else { var services = context.ActionContext.HttpContext.RequestServices; filterItem.Filter = filterFactory.CreateInstance(services); filterItem.IsReusable = filterFactory.IsReusable; if (filterItem.Filter == null) { throw new InvalidOperationException(Resources.FormatTypeMethodMustReturnNotNullValue( "CreateInstance", typeof(IFilterFactory).Name)); } ApplyFilterToContainer(filterItem.Filter, filterFactory); } }
/// <inheritdoc /> public void OnProvidersExecuting(FilterProviderContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } var services = context.ActionContext.HttpContext.RequestServices; var filters = services.GetService<IEnumerable<IFilterMetadata>>(); if (context.ActionContext.ActionDescriptor.FilterDescriptors != null) { foreach (var filter in filters) { var filterItem = new FilterItem(new FilterDescriptor(filter, FilterScope.Global), filter) { IsReusable = false }; // TODO: Remove this when https://github.com/aspnet/Mvc/issues/4504 // is fixed for (var i=0; i < context.Results.Count; i++) { if(context.Results[i].Filter.GetType() == filter.GetType()) { context.Results.RemoveAt(i); break; } } context.Results.Add(filterItem); } } }
public void ProvideFilter(FilterProviderContext context, FilterItem filterItem) { if (filterItem.Filter != null) { return; } var filter = filterItem.Descriptor.Filter; if (!(filter is IFilterFactory filterFactory)) { filterItem.Filter = filter; filterItem.IsReusable = true; }
public static FilterFactoryResult GetAllFilters( IFilterProvider[] filterProviders, ActionContext actionContext) { if (filterProviders == null) { throw new ArgumentNullException(nameof(filterProviders)); } if (actionContext == null) { throw new ArgumentNullException(nameof(actionContext)); } var actionDescriptor = actionContext.ActionDescriptor; var staticFilterItems = new FilterItem[actionDescriptor.FilterDescriptors.Count]; var orderedFilters = actionDescriptor.FilterDescriptors .OrderBy( filter => filter, FilterDescriptorOrderComparer.Comparer) .ToList(); for (var i = 0; i < orderedFilters.Count; i++) { staticFilterItems[i] = new FilterItem(orderedFilters[i]); } var allFilterItems = new List <FilterItem>(staticFilterItems); // Execute the filter factory to determine which static filters can be cached. var filters = CreateUncachedFiltersCore(filterProviders, actionContext, allFilterItems); // Cache the filter items based on the following criteria // 1. Are created statically (ex: via filter attributes, added to global filter list etc.) // 2. Are re-usable for (var i = 0; i < staticFilterItems.Length; i++) { var item = staticFilterItems[i]; if (!item.IsReusable) { item.Filter = null; } } return(new FilterFactoryResult(staticFilterItems, filters)); }
/// <inheritdoc /> public void OnProvidersExecuting(FilterProviderContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } var services = context.ActionContext.HttpContext.RequestServices; var filters = services.GetService<IEnumerable<IFilterMetadata>>(); if (context.ActionContext.ActionDescriptor.FilterDescriptors != null) { foreach (var filter in filters) { var filterItem = new FilterItem(new FilterDescriptor(filter, FilterScope.Global), filter); context.Results.Add(filterItem); } } }