Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        /// <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);
                }
            }
        }
Ejemplo n.º 3
0
        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;
            }
Ejemplo n.º 4
0
        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));
        }
Ejemplo n.º 5
0
        /// <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);
                }
            }
        }