From 157b63375829682be1f3f25c270c2c3b019e9833 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 12 Jan 2015 10:25:21 -0800 Subject: [PATCH] React to IContextAccessor -> IScopedInstance --- .../AntiForgery/AntiForgeryTokenStore.cs | 6 ++-- .../ModelBinders/BodyModelBinder.cs | 2 +- .../MvcRouteHandler.cs | 35 ++++++++----------- src/Microsoft.AspNet.Mvc.Core/UrlHelper.cs | 2 +- .../MvcServiceCollectionExtensions.cs | 2 +- .../ActionResults/RedirectResultTest.cs | 2 +- .../AntiXsrf/AntiForgeryTokenStoreTest.cs | 14 ++++---- .../BodyModelBinderTests.cs | 6 ++-- .../MvcRouteHandlerTests.cs | 9 ++--- .../UrlHelperTest.cs | 8 ++--- .../RequestIdService.cs | 5 ++- .../RoutingWebSite/TestResponseGenerator.cs | 2 +- .../UrlHelperWebSite/CustomUrlHelper.cs | 4 +-- .../TestResponseGenerator.cs | 2 +- 14 files changed, 43 insertions(+), 56 deletions(-) diff --git a/src/Microsoft.AspNet.Mvc.Core/AntiForgery/AntiForgeryTokenStore.cs b/src/Microsoft.AspNet.Mvc.Core/AntiForgery/AntiForgeryTokenStore.cs index 4395181cd4..659cad3211 100644 --- a/src/Microsoft.AspNet.Mvc.Core/AntiForgery/AntiForgeryTokenStore.cs +++ b/src/Microsoft.AspNet.Mvc.Core/AntiForgery/AntiForgeryTokenStore.cs @@ -24,7 +24,7 @@ namespace Microsoft.AspNet.Mvc public AntiForgeryToken GetCookieToken(HttpContext httpContext) { var contextAccessor = - httpContext.RequestServices.GetRequiredService>(); + httpContext.RequestServices.GetRequiredService>(); if (contextAccessor.Value != null) { return contextAccessor.Value.CookieToken; @@ -58,9 +58,9 @@ namespace Microsoft.AspNet.Mvc // Add the cookie to the request based context. // This is useful if the cookie needs to be reloaded in the context of the same request. var contextAccessor = - httpContext.RequestServices.GetRequiredService>(); + httpContext.RequestServices.GetRequiredService>(); Debug.Assert(contextAccessor.Value == null, "AntiForgeryContext should be set only once per request."); - contextAccessor.SetValue(new AntiForgeryContext() { CookieToken = token }); + contextAccessor.Value = new AntiForgeryContext() { CookieToken = token }; var serializedToken = _serializer.Serialize(token); var options = new CookieOptions() { HttpOnly = true }; diff --git a/src/Microsoft.AspNet.Mvc.Core/ModelBinders/BodyModelBinder.cs b/src/Microsoft.AspNet.Mvc.Core/ModelBinders/BodyModelBinder.cs index 61f29da8d9..16de4cbe5b 100644 --- a/src/Microsoft.AspNet.Mvc.Core/ModelBinders/BodyModelBinder.cs +++ b/src/Microsoft.AspNet.Mvc.Core/ModelBinders/BodyModelBinder.cs @@ -19,7 +19,7 @@ namespace Microsoft.AspNet.Mvc private readonly IBodyModelValidator _bodyModelValidator; private readonly IValidationExcludeFiltersProvider _bodyValidationExcludeFiltersProvider; - public BodyModelBinder([NotNull] IContextAccessor context, + public BodyModelBinder([NotNull] IScopedInstance context, [NotNull] IInputFormatterSelector selector, [NotNull] IBodyModelValidator bodyModelValidator, [NotNull] IValidationExcludeFiltersProvider bodyValidationExcludeFiltersProvider) diff --git a/src/Microsoft.AspNet.Mvc.Core/MvcRouteHandler.cs b/src/Microsoft.AspNet.Mvc.Core/MvcRouteHandler.cs index 33d911f67d..cdec854f81 100644 --- a/src/Microsoft.AspNet.Mvc.Core/MvcRouteHandler.cs +++ b/src/Microsoft.AspNet.Mvc.Core/MvcRouteHandler.cs @@ -95,32 +95,25 @@ namespace Microsoft.AspNet.Mvc var optionsAccessor = services.GetRequiredService>(); actionContext.ModelState.MaxAllowedErrors = optionsAccessor.Options.MaxModelValidationErrors; - var contextAccessor = services.GetRequiredService>(); - using (contextAccessor.SetContextSource(() => actionContext, PreventExchange)) + var contextAccessor = services.GetRequiredService>(); + contextAccessor.Value = actionContext; + var invokerFactory = services.GetRequiredService(); + var invoker = invokerFactory.CreateInvoker(actionContext); + if (invoker == null) { - var invokerFactory = services.GetRequiredService(); - var invoker = invokerFactory.CreateInvoker(actionContext); - if (invoker == null) - { - LogActionSelection(actionSelected: true, actionInvoked: false, handled: context.IsHandled); + LogActionSelection(actionSelected: true, actionInvoked: false, handled: context.IsHandled); - var ex = new InvalidOperationException( - Resources.FormatActionInvokerFactory_CouldNotCreateInvoker( - actionDescriptor.DisplayName)); + var ex = new InvalidOperationException( + Resources.FormatActionInvokerFactory_CouldNotCreateInvoker( + actionDescriptor.DisplayName)); - // Add tracing/logging (what do we think of this pattern of - // tacking on extra data on the exception?) - ex.Data.Add("AD", actionDescriptor); - throw ex; - } - - await invoker.InvokeAsync(); + // Add tracing/logging (what do we think of this pattern of + // tacking on extra data on the exception?) + ex.Data.Add("AD", actionDescriptor); + throw ex; } - } - private ActionContext PreventExchange(ActionContext contex) - { - throw new InvalidOperationException(Resources.ActionContextAccessor_SetValueNotSupported); + await invoker.InvokeAsync(); } private void EnsureLogger(HttpContext context) diff --git a/src/Microsoft.AspNet.Mvc.Core/UrlHelper.cs b/src/Microsoft.AspNet.Mvc.Core/UrlHelper.cs index 8dca748c38..9d8bbfa1ee 100644 --- a/src/Microsoft.AspNet.Mvc.Core/UrlHelper.cs +++ b/src/Microsoft.AspNet.Mvc.Core/UrlHelper.cs @@ -30,7 +30,7 @@ namespace Microsoft.AspNet.Mvc /// The to be used for verifying the correctness of /// supplied parameters for a route. /// - public UrlHelper(IContextAccessor contextAccessor, IActionSelector actionSelector) + public UrlHelper(IScopedInstance contextAccessor, IActionSelector actionSelector) { _httpContext = contextAccessor.Value.HttpContext; _router = contextAccessor.Value.RouteData.Routers[0]; diff --git a/src/Microsoft.AspNet.Mvc/MvcServiceCollectionExtensions.cs b/src/Microsoft.AspNet.Mvc/MvcServiceCollectionExtensions.cs index 674192e7c0..72be824d09 100644 --- a/src/Microsoft.AspNet.Mvc/MvcServiceCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Mvc/MvcServiceCollectionExtensions.cs @@ -22,7 +22,7 @@ namespace Microsoft.Framework.DependencyInjection services.AddOptions(configuration); services.AddDataProtection(configuration); services.AddRouting(configuration); - services.AddContextAccessor(configuration); + services.AddScopedInstance(configuration); services.Configure(routeOptions => routeOptions.ConstraintMap .Add("exists", diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/ActionResults/RedirectResultTest.cs b/test/Microsoft.AspNet.Mvc.Core.Test/ActionResults/RedirectResultTest.cs index ff538dba27..e7ef95496f 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/ActionResults/RedirectResultTest.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/ActionResults/RedirectResultTest.cs @@ -116,7 +116,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test { var httpContext = new Mock(); var actionContext = GetActionContext(httpContext.Object); - var mockContentAccessor = new Mock>(); + var mockContentAccessor = new Mock>(); mockContentAccessor.SetupGet(o => o.Value).Returns(actionContext); var mockActionSelector = new Mock(); var urlHelper = new UrlHelper(mockContentAccessor.Object, mockActionSelector.Object); diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/AntiXsrf/AntiForgeryTokenStoreTest.cs b/test/Microsoft.AspNet.Mvc.Core.Test/AntiXsrf/AntiForgeryTokenStoreTest.cs index 650efd2c82..2be0f714ba 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/AntiXsrf/AntiForgeryTokenStoreTest.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/AntiXsrf/AntiForgeryTokenStoreTest.cs @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test mockHttpContext .Setup(o => o.Request.Cookies) .Returns(requestCookies.Object); - var contextAccessor = new ContextAccessor(); + var contextAccessor = new ScopedInstance(); mockHttpContext.SetupGet(o => o.RequestServices) .Returns(GetServiceProvider(contextAccessor)); var config = new AntiForgeryOptions() @@ -60,13 +60,13 @@ namespace Microsoft.AspNet.Mvc.Core.Test mockHttpContext .Setup(o => o.Request.Cookies) .Returns(requestCookies.Object); - var contextAccessor = new ContextAccessor(); + var contextAccessor = new ScopedInstance(); mockHttpContext.SetupGet(o => o.RequestServices) .Returns(GetServiceProvider(contextAccessor)); // add a cookie explicitly. var cookie = new AntiForgeryToken(); - contextAccessor.SetValue(new AntiForgeryContext() { CookieToken = cookie }); + contextAccessor.Value = new AntiForgeryContext() { CookieToken = cookie }; var config = new AntiForgeryOptions() { CookieName = _cookieName @@ -275,7 +275,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test var mockHttpContext = new Mock(); mockHttpContext.Setup(o => o.Response.Cookies) .Returns(cookies); - var contextAccessor = new ContextAccessor(); + var contextAccessor = new ScopedInstance(); mockHttpContext.SetupGet(o => o.RequestServices) .Returns(GetServiceProvider(contextAccessor)); @@ -317,17 +317,17 @@ namespace Microsoft.AspNet.Mvc.Core.Test mockHttpContext.Setup(o => o.Request) .Returns(request.Object); - var contextAccessor = new ContextAccessor(); + var contextAccessor = new ScopedInstance(); mockHttpContext.SetupGet(o => o.RequestServices) .Returns(GetServiceProvider(contextAccessor)); return mockHttpContext.Object; } - private static IServiceProvider GetServiceProvider(IContextAccessor contextAccessor) + private static IServiceProvider GetServiceProvider(IScopedInstance contextAccessor) { var serviceCollection = new ServiceCollection(); - serviceCollection.AddInstance>(contextAccessor); + serviceCollection.AddInstance>(contextAccessor); return serviceCollection.BuildServiceProvider(); } diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/BodyModelBinderTests.cs b/test/Microsoft.AspNet.Mvc.Core.Test/BodyModelBinderTests.cs index 2ae8587c81..ed0ad628ff 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/BodyModelBinderTests.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/BodyModelBinderTests.cs @@ -128,12 +128,12 @@ namespace Microsoft.AspNet.Mvc return binder; } - private static IContextAccessor CreateActionContext(HttpContext context) + private static IScopedInstance CreateActionContext(HttpContext context) { return CreateActionContext(context, (new Mock()).Object); } - private static IContextAccessor CreateActionContext(HttpContext context, IRouter router) + private static IScopedInstance CreateActionContext(HttpContext context, IRouter router) { var routeData = new RouteData(); routeData.Routers.Add(router); @@ -141,7 +141,7 @@ namespace Microsoft.AspNet.Mvc var actionContext = new ActionContext(context, routeData, new ActionDescriptor()); - var contextAccessor = new Mock>(); + var contextAccessor = new Mock>(); contextAccessor.SetupGet(c => c.Value) .Returns(actionContext); return contextAccessor.Object; diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/MvcRouteHandlerTests.cs b/test/Microsoft.AspNet.Mvc.Core.Test/MvcRouteHandlerTests.cs index eff727f431..7b24cf6bba 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/MvcRouteHandlerTests.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/MvcRouteHandlerTests.cs @@ -246,12 +246,7 @@ namespace Microsoft.AspNet.Mvc ILoggerFactory loggerFactory = null, IOptions optionsAccessor = null) { - var mockContextAccessor = new Mock>(); - mockContextAccessor.Setup(c => c.SetContextSource( - It.IsAny>(), - It.IsAny>())) - .Returns(NullDisposable.Instance); - + var mockContextAccessor = new Mock>(); if (actionSelector == null) { @@ -292,7 +287,7 @@ namespace Microsoft.AspNet.Mvc } var httpContext = new Mock(); - httpContext.Setup(h => h.RequestServices.GetService(typeof(IContextAccessor))) + httpContext.Setup(h => h.RequestServices.GetService(typeof(IScopedInstance))) .Returns(mockContextAccessor.Object); httpContext.Setup(h => h.RequestServices.GetService(typeof(IActionSelector))) .Returns(actionSelector); diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/UrlHelperTest.cs b/test/Microsoft.AspNet.Mvc.Core.Test/UrlHelperTest.cs index c2c490a6b9..79b911f37a 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/UrlHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/UrlHelperTest.cs @@ -560,12 +560,12 @@ namespace Microsoft.AspNet.Mvc.Core.Test return context.Object; } - private static IContextAccessor CreateActionContext(HttpContext context) + private static IScopedInstance CreateActionContext(HttpContext context) { return CreateActionContext(context, (new Mock()).Object); } - private static IContextAccessor CreateActionContext(HttpContext context, IRouter router) + private static IScopedInstance CreateActionContext(HttpContext context, IRouter router) { var routeData = new RouteData(); routeData.Routers.Add(router); @@ -573,7 +573,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test var actionContext = new ActionContext(context, routeData, new ActionDescriptor()); - var contextAccessor = new Mock>(); + var contextAccessor = new Mock>(); contextAccessor.SetupGet(c => c.Value) .Returns(actionContext); return contextAccessor.Object; @@ -599,7 +599,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test return new UrlHelper(actionContext, actionSelector.Object); } - private static UrlHelper CreateUrlHelper(IContextAccessor contextAccessor) + private static UrlHelper CreateUrlHelper(IScopedInstance contextAccessor) { var actionSelector = new Mock(MockBehavior.Strict); return new UrlHelper(contextAccessor, actionSelector.Object); diff --git a/test/WebSites/RequestServicesWebSite/RequestIdService.cs b/test/WebSites/RequestServicesWebSite/RequestIdService.cs index f1d9735f0d..1a59239e75 100644 --- a/test/WebSites/RequestServicesWebSite/RequestIdService.cs +++ b/test/WebSites/RequestServicesWebSite/RequestIdService.cs @@ -2,15 +2,14 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http; -using Microsoft.Framework.DependencyInjection; +using Microsoft.AspNet.Hosting; namespace RequestServicesWebSite { public class RequestIdService { // This service can only be instantiated by a request-scoped container - public RequestIdService(IServiceProvider services, IContextAccessor contextAccessor) + public RequestIdService(IServiceProvider services, IHttpContextAccessor contextAccessor) { if (contextAccessor.Value.RequestServices != services) { diff --git a/test/WebSites/RoutingWebSite/TestResponseGenerator.cs b/test/WebSites/RoutingWebSite/TestResponseGenerator.cs index cf6f1dcb19..13e247eacc 100644 --- a/test/WebSites/RoutingWebSite/TestResponseGenerator.cs +++ b/test/WebSites/RoutingWebSite/TestResponseGenerator.cs @@ -14,7 +14,7 @@ namespace RoutingWebSite { private readonly ActionContext _actionContext; - public TestResponseGenerator(IContextAccessor contextAccessor) + public TestResponseGenerator(IScopedInstance contextAccessor) { _actionContext = contextAccessor.Value; if (_actionContext == null) diff --git a/test/WebSites/UrlHelperWebSite/CustomUrlHelper.cs b/test/WebSites/UrlHelperWebSite/CustomUrlHelper.cs index c47ccf85c4..4598e32e49 100644 --- a/test/WebSites/UrlHelperWebSite/CustomUrlHelper.cs +++ b/test/WebSites/UrlHelperWebSite/CustomUrlHelper.cs @@ -19,8 +19,8 @@ namespace UrlHelperWebSite private readonly IOptions _appOptions; private readonly HttpContext _httpContext; - public CustomUrlHelper(IContextAccessor contextAccessor, IActionSelector actionSelector, - IOptions appOptions) + public CustomUrlHelper(IScopedInstance contextAccessor, IActionSelector actionSelector, + IOptions appOptions) : base(contextAccessor, actionSelector) { _appOptions = appOptions; diff --git a/test/WebSites/VersioningWebSite/TestResponseGenerator.cs b/test/WebSites/VersioningWebSite/TestResponseGenerator.cs index 45431ed458..ce599a3ed0 100644 --- a/test/WebSites/VersioningWebSite/TestResponseGenerator.cs +++ b/test/WebSites/VersioningWebSite/TestResponseGenerator.cs @@ -14,7 +14,7 @@ namespace VersioningWebSite { private readonly ActionContext _actionContext; - public TestResponseGenerator(IContextAccessor contextAccessor) + public TestResponseGenerator(IScopedInstance contextAccessor) { _actionContext = contextAccessor.Value; if (_actionContext == null)