Feedback: Make common base class for all contexts and all of them expose FilterItem collection

ExtensionMethod will now apply to the base FilterContext class
This commit is contained in:
Yishai Galatzer 2014-03-20 09:59:00 -07:00
parent adffc95b81
commit 8b6d39507d
11 changed files with 53 additions and 40 deletions

View File

@ -4,7 +4,7 @@ using Microsoft.AspNet.Mvc;
namespace MvcSample.Web.Filters namespace MvcSample.Web.Filters
{ {
public class BlockAnonynous : AuthorizationFilterAttribute public class BlockAnonymous : AuthorizationFilterAttribute
{ {
public override async Task Invoke(AuthorizationFilterContext context, Func<Task> next) public override async Task Invoke(AuthorizationFilterContext context, Func<Task> next)
{ {

View File

@ -9,11 +9,11 @@ namespace MvcSample.Web.Filters
{ {
public async override Task Invoke(ActionResultFilterContext context, Func<Task> next) public async override Task Invoke(ActionResultFilterContext context, Func<Task> next)
{ {
ViewResult viewResult = context.Result as ViewResult; var viewResult = context.ActionResult as ViewResult;
if (viewResult != null) if (viewResult != null)
{ {
User user = viewResult.ViewData.Model as User; var user = viewResult.ViewData.Model as User;
if (user != null) if (user != null)
{ {

View File

@ -9,7 +9,7 @@ namespace MvcSample.Web
[PassThrough(Order = 0)] [PassThrough(Order = 0)]
[PassThrough(Order = 2)] [PassThrough(Order = 2)]
[InspectResultPage] [InspectResultPage]
[BlockAnonynous] [BlockAnonymous]
[UserNameProvider(Order = -1)] [UserNameProvider(Order = -1)]
public class FiltersController : Controller public class FiltersController : Controller
{ {

View File

@ -3,9 +3,9 @@ using Microsoft.AspNet.Mvc.Filters;
namespace Microsoft.AspNet.Mvc namespace Microsoft.AspNet.Mvc
{ {
public static class AuthorizationFilterContextExtensions public static class FilterContextExtensions
{ {
public static bool HasAllowAnonymous([NotNull] this AuthorizationFilterContext context) public static bool HasAllowAnonymous([NotNull] this FilterContext context)
{ {
return context.FilterItems.Any(item => item.Filter is IAllowAnonymous); return context.FilterItems.Any(item => item.Filter is IAllowAnonymous);
} }

View File

@ -1,21 +1,18 @@
using System; using System.Collections.Generic;
using System.Collections.Generic; using Microsoft.AspNet.Mvc.Filters;
namespace Microsoft.AspNet.Mvc namespace Microsoft.AspNet.Mvc
{ {
public class ActionFilterContext public class ActionFilterContext : FilterContext
{ {
public ActionFilterContext(ActionContext actionContext, public ActionFilterContext([NotNull] ActionContext actionContext,
IDictionary<string, object> actionArguments) [NotNull] IReadOnlyList<FilterItem> filterItems,
[NotNull] IDictionary<string, object> actionArguments)
: base(actionContext, filterItems)
{ {
ActionContext = actionContext;
ActionArguments = actionArguments; ActionArguments = actionArguments;
} }
public virtual IDictionary<string, object> ActionArguments { get; private set; } public virtual IDictionary<string, object> ActionArguments { get; private set; }
public virtual ActionContext ActionContext { get; private set; }
public virtual IActionResult Result { get; set; }
} }
} }

View File

@ -31,7 +31,7 @@ namespace Microsoft.AspNet.Mvc.Filters
context.ActionArguments); context.ActionArguments);
var underlyingReturnType = TypeHelper.GetTaskInnerTypeOrNull(actionMethodInfo.ReturnType) ?? actionMethodInfo.ReturnType; var underlyingReturnType = TypeHelper.GetTaskInnerTypeOrNull(actionMethodInfo.ReturnType) ?? actionMethodInfo.ReturnType;
context.Result = _actionResultFactory.CreateActionResult( context.ActionResult = _actionResultFactory.CreateActionResult(
underlyingReturnType, underlyingReturnType,
actionReturnValue, actionReturnValue,
context.ActionContext); context.ActionContext);

View File

@ -1,15 +1,14 @@
namespace Microsoft.AspNet.Mvc using System.Collections.Generic;
using Microsoft.AspNet.Mvc.Filters;
namespace Microsoft.AspNet.Mvc
{ {
public class ActionResultFilterContext public class ActionResultFilterContext : FilterContext
{ {
public ActionResultFilterContext(ActionContext actionContext, IActionResult initialResult) public ActionResultFilterContext(ActionContext actionContext, IReadOnlyList<FilterItem> filterItems, IActionResult initialResult)
: base(actionContext, filterItems)
{ {
ActionContext = actionContext; ActionResult = initialResult;
Result = initialResult;
} }
public ActionContext ActionContext { get; private set; }
public IActionResult Result { get; set; }
} }
} }

View File

@ -9,12 +9,12 @@ namespace Microsoft.AspNet.Mvc.Filters
public async Task Invoke(ActionResultFilterContext context, Func<Task> next) public async Task Invoke(ActionResultFilterContext context, Func<Task> next)
{ {
// result can get cleared at any point in the pipeline // result can get cleared at any point in the pipeline
if (context.Result == null) if (context.ActionResult == null)
{ {
context.Result = new EmptyResult(); context.ActionResult = new EmptyResult();
} }
await context.Result.ExecuteResultAsync(context.ActionContext); await context.ActionResult.ExecuteResultAsync(context.ActionContext);
} }
} }
} }

View File

@ -1,25 +1,21 @@
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.AspNet.Mvc.Filters;
namespace Microsoft.AspNet.Mvc namespace Microsoft.AspNet.Mvc
{ {
public class AuthorizationFilterContext public class AuthorizationFilterContext : FilterContext
{ {
private IActionResult _actionResult; private IActionResult _actionResult;
public AuthorizationFilterContext([NotNull] ActionContext actionContext, [NotNull] IReadOnlyList<FilterItem> filterItems) public AuthorizationFilterContext([NotNull] ActionContext actionContext, [NotNull] IReadOnlyList<FilterItem> filterItems)
: base(actionContext, filterItems)
{ {
ActionContext = actionContext;
FilterItems = filterItems;
} }
public bool HasFailed { get; private set; } public bool HasFailed { get; private set; }
public ActionContext ActionContext { get; private set; }
public IReadOnlyList<FilterItem> FilterItems { get; private set; }
// Result // Result
public IActionResult ActionResult public override IActionResult ActionResult
{ {
get { return _actionResult; } get { return _actionResult; }
set set

View File

@ -0,0 +1,19 @@
using System.Collections.Generic;
namespace Microsoft.AspNet.Mvc.Filters
{
public class FilterContext
{
public FilterContext([NotNull] ActionContext actionContext, [NotNull] IReadOnlyList<FilterItem> filterItems)
{
ActionContext = actionContext;
FilterItems = filterItems;
}
public ActionContext ActionContext { get; private set; }
public IReadOnlyList<FilterItem> FilterItems { get; private set; }
// Result
public virtual IActionResult ActionResult { get; set; }
}
}

View File

@ -47,6 +47,7 @@ namespace Microsoft.AspNet.Mvc
Select(fd => new FilterItem(fd)).ToList()); Select(fd => new FilterItem(fd)).ToList());
_filterProvider.Invoke(filterProviderContext); _filterProvider.Invoke(filterProviderContext);
var filterMetaItems = filterProviderContext.Result.ToArray();
PreArrangeFiltersInPipeline(filterProviderContext); PreArrangeFiltersInPipeline(filterProviderContext);
@ -72,7 +73,7 @@ namespace Microsoft.AspNet.Mvc
var authZEndPoint = new AuthorizationFilterEndPoint(); var authZEndPoint = new AuthorizationFilterEndPoint();
_authorizationFilters.Add(authZEndPoint); _authorizationFilters.Add(authZEndPoint);
var authZContext = new AuthorizationFilterContext(_actionContext, filterProviderContext.Result.ToArray()); var authZContext = new AuthorizationFilterContext(_actionContext, filterMetaItems);
var authZPipeline = new FilterPipelineBuilder<AuthorizationFilterContext>(_authorizationFilters, authZContext); var authZPipeline = new FilterPipelineBuilder<AuthorizationFilterContext>(_authorizationFilters, authZContext);
await authZPipeline.InvokeAsync(); await authZPipeline.InvokeAsync();
@ -99,6 +100,7 @@ namespace Microsoft.AspNet.Mvc
var parameterValues = await GetParameterValues(modelState); var parameterValues = await GetParameterValues(modelState);
var actionFilterContext = new ActionFilterContext(_actionContext, var actionFilterContext = new ActionFilterContext(_actionContext,
filterMetaItems,
parameterValues); parameterValues);
var actionEndPoint = new ReflectedActionFilterEndPoint(_actionResultFactory, controller); var actionEndPoint = new ReflectedActionFilterEndPoint(_actionResultFactory, controller);
@ -109,12 +111,12 @@ namespace Microsoft.AspNet.Mvc
await actionFilterPipeline.InvokeAsync(); await actionFilterPipeline.InvokeAsync();
actionResult = actionFilterContext.Result; actionResult = actionFilterContext.ActionResult;
} }
} }
} }
var actionResultFilterContext = new ActionResultFilterContext(_actionContext, actionResult); var actionResultFilterContext = new ActionResultFilterContext(_actionContext, filterMetaItems, actionResult);
var actionResultFilterEndPoint = new ActionResultFilterEndPoint(); var actionResultFilterEndPoint = new ActionResultFilterEndPoint();
_actionResultFilters.Add(actionResultFilterEndPoint); _actionResultFilters.Add(actionResultFilterEndPoint);