One more refactoring

This commit is contained in:
Yishai Galatzer 2014-03-13 17:25:37 -07:00
parent fc168d63f6
commit c4481cf390
3 changed files with 47 additions and 27 deletions

View File

@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using Microsoft.AspNet.DependencyInjection;
@ -26,9 +25,9 @@ namespace Microsoft.AspNet.Mvc.Filters
// make a copy of the list, TODO: Make the actiondescriptor immutable
var filterDescriptors = context.ActionDescriptor.FilterDescriptors.ToArray();
for (int i = 0; i < filterDescriptors.Length; i++)
foreach (var item in context.Items)
{
ProvideFilter(context, filterDescriptors[i].Filter);
ProvideFilter(context, item);
}
}
@ -38,9 +37,16 @@ namespace Microsoft.AspNet.Mvc.Filters
}
}
public virtual void ProvideFilter(FilterProviderContext context, IFilter filter)
public virtual void ProvideFilter(FilterProviderContext context, FilterProviderContext.FilterItem filterItem)
{
var serviceFilterSignature = filter as IServiceFilter;
var filter = filterItem.Filter;
if (filter != null)
{
return;
}
var serviceFilterSignature = filterItem.Descriptor.Filter as IServiceFilter;
if (serviceFilterSignature != null)
{
var serviceFilter = ServiceProvider.GetService(serviceFilterSignature.ServiceType) as IFilter;
@ -50,12 +56,11 @@ namespace Microsoft.AspNet.Mvc.Filters
throw new InvalidOperationException("Service filter must be of type IFilter");
}
ApplyFilterToContainer(serviceFilter, filter);
AddFilters(context, serviceFilter);
filterItem.Filter = serviceFilter;
}
else
{
var typeFilterSignature = filter as ITypeFilter;
var typeFilterSignature = filterItem.Descriptor.Filter as ITypeFilter;
if (typeFilterSignature != null)
{
if (typeFilterSignature.ImplementationType == null)
@ -72,25 +77,15 @@ namespace Microsoft.AspNet.Mvc.Filters
var typeFilter = ActivatorUtilities.CreateInstance(ServiceProvider, typeFilterSignature.ImplementationType) as IFilter;
ApplyFilterToContainer(typeFilter, filter);
AddFilters(context, typeFilter);
filterItem.Filter = typeFilter;
}
else
{
AddFilters(context, filter);
filterItem.Filter = filter;
}
}
}
private void AddFilters(FilterProviderContext context, IFilter filter)
{
if (context.OrderedFilterList == null)
{
context.OrderedFilterList = new List<IFilter>();
}
context.OrderedFilterList.Add(filter);
}
private void ApplyFilterToContainer(object actualFilter, IFilter filterMetadata)
{
Contract.Assert(actualFilter != null, "actualFilter should not be null");

View File

@ -4,15 +4,33 @@ namespace Microsoft.AspNet.Mvc
{
public class FilterProviderContext
{
public FilterProviderContext(ActionDescriptor actionDescriptor)
public FilterProviderContext(ActionDescriptor actionDescriptor, List<FilterItem> items)
{
ActionDescriptor = actionDescriptor;
Items = items;
}
// Input
public ActionDescriptor ActionDescriptor { get; set; }
// Result
public List<IFilter> OrderedFilterList { get; set; }
public List<FilterItem> Items { get; set; }
public class FilterItem
{
public FilterItem([NotNull] FilterDescriptor descriptor)
{
Descriptor = descriptor;
}
public FilterItem([NotNull] FilterDescriptor descriptor, [NotNull] IFilter filter) : this(descriptor)
{
Filter = filter;
}
public FilterDescriptor Descriptor { get; set; }
public IFilter Filter { get; set; }
}
}
}

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNet.DependencyInjection;
using Microsoft.AspNet.Mvc.Filters;
@ -39,9 +40,15 @@ namespace Microsoft.AspNet.Mvc
public async Task InvokeActionAsync()
{
IActionResult actionResult;
var filterProviderContext = new FilterProviderContext(_descriptor);
var filterProviderContext =
new FilterProviderContext(_descriptor,
_descriptor.
FilterDescriptors.
Select(fd => new FilterProviderContext.FilterItem(fd)).ToList());
_filterProvider.Invoke(filterProviderContext);
// TODO: arrange when needed.
PreArrangeFiltersInPipeline(filterProviderContext);
var modelState = new ModelStateDictionary();
@ -61,8 +68,6 @@ namespace Microsoft.AspNet.Mvc
}
else
{
var parameterValues = await GetParameterValues(modelState);
if (_authorizationFilters.Count > 0)
{
var authZEndPoint = new AuthorizationFilterEndPoint();
@ -92,6 +97,8 @@ namespace Microsoft.AspNet.Mvc
if (actionResult == null)
{
var parameterValues = await GetParameterValues(modelState);
var actionFilterContext = new ActionFilterContext(_actionContext,
parameterValues,
method.ReturnType);
@ -153,12 +160,12 @@ namespace Microsoft.AspNet.Mvc
private void PreArrangeFiltersInPipeline(FilterProviderContext context)
{
if (context.OrderedFilterList == null || context.OrderedFilterList.Count == 0)
if (context.Items == null || context.Items.Count == 0)
{
return;
}
foreach (var filter in context.OrderedFilterList)
foreach (var filter in context.Items)
{
PlaceFilter(filter);
}