From 90b40832ff8628d53a461449d50b047c79da6fbe Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 1 Aug 2014 10:37:06 -0700 Subject: [PATCH] Modify RazorView to be instantiated via TypeActivator Partial fix for #889 --- src/Microsoft.AspNet.Mvc.Razor/IRazorPage.cs | 2 +- src/Microsoft.AspNet.Mvc.Razor/RazorView.cs | 17 +++--- .../RazorViewEngine.cs | 20 +++--- .../RazorViewEngineTest.cs | 18 ++++-- .../RazorViewTest.cs | 61 +++++++++++-------- 5 files changed, 70 insertions(+), 48 deletions(-) diff --git a/src/Microsoft.AspNet.Mvc.Razor/IRazorPage.cs b/src/Microsoft.AspNet.Mvc.Razor/IRazorPage.cs index 057f066d2a..d8a8780415 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/IRazorPage.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/IRazorPage.cs @@ -25,7 +25,7 @@ namespace Microsoft.AspNet.Mvc.Razor Action RenderBodyDelegate { get; set; } /// - /// Gets the path to the page. + /// Gets the application base relative path to the page. /// string Path { get; set; } diff --git a/src/Microsoft.AspNet.Mvc.Razor/RazorView.cs b/src/Microsoft.AspNet.Mvc.Razor/RazorView.cs index 31bdd04ea0..08050291a4 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/RazorView.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/RazorView.cs @@ -17,33 +17,34 @@ namespace Microsoft.AspNet.Mvc.Razor private readonly IRazorPageActivator _pageActivator; private readonly IViewStartProvider _viewStartProvider; private readonly IRazorPage _page; - private readonly bool _executeViewHierarchy; /// /// Initializes a new instance of RazorView /// /// The page to execute - /// The view factory used to instantiate additional views. + /// The view factory used to instantiate layout and _ViewStart pages. /// The used to activate pages. - /// A value that indiciates whether the view hierarchy that involves - /// view start and layout pages are executed as part of the executing the page. public RazorView([NotNull] IRazorPageFactory pageFactory, [NotNull] IRazorPageActivator pageActivator, [NotNull] IViewStartProvider viewStartProvider, - [NotNull] IRazorPage page, - bool executeViewHierarchy) + [NotNull] IRazorPage page) { _pageFactory = pageFactory; _pageActivator = pageActivator; _viewStartProvider = viewStartProvider; _page = page; - _executeViewHierarchy = executeViewHierarchy; } + /// + /// Gets or sets a value that determines if the view hierarchy is executed as part of + /// executing the instance. The view hierarchy involves _ViewStart + /// and Layout pages. + public bool ExecuteViewHierarchy { get; set; } + /// public async Task RenderAsync([NotNull] ViewContext context) { - if (_executeViewHierarchy) + if (ExecuteViewHierarchy) { var bodyWriter = await RenderPageAsync(_page, context, executeViewStart: true); await RenderLayoutAsync(context, bodyWriter); diff --git a/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngine.cs b/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngine.cs index 8d3d283274..b423f35511 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngine.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngine.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using Microsoft.AspNet.Mvc.Rendering; +using Microsoft.Framework.DependencyInjection; namespace Microsoft.AspNet.Mvc.Razor { @@ -30,8 +31,8 @@ namespace Microsoft.AspNet.Mvc.Razor }; private readonly IRazorPageFactory _pageFactory; - private readonly IRazorPageActivator _pageActivator; - private readonly IViewStartProvider _viewStartProvider; + private readonly ITypeActivator _typeActivator; + private readonly IServiceProvider _serviceProvider; /// /// Initializes a new instance of the RazorViewEngine class. @@ -41,12 +42,12 @@ namespace Microsoft.AspNet.Mvc.Razor /// The provider used to provide instances of ViewStarts applicable to the /// page being rendered. public RazorViewEngine(IRazorPageFactory pageFactory, - IRazorPageActivator pageActivator, - IViewStartProvider viewStartProvider) + ITypeActivator typeActivator, + IServiceProvider serviceProvider) { _pageFactory = pageFactory; - _pageActivator = pageActivator; - _viewStartProvider = viewStartProvider; + _typeActivator = typeActivator; + _serviceProvider = serviceProvider; } public IEnumerable ViewLocationFormats @@ -110,11 +111,8 @@ namespace Microsoft.AspNet.Mvc.Razor private ViewEngineResult CreateFoundResult(IRazorPage page, string viewName, bool partial) { - var view = new RazorView(_pageFactory, - _pageActivator, - _viewStartProvider, - page, - executeViewHierarchy: !partial); + var view = _typeActivator.CreateInstance(_serviceProvider, page); + view.ExecuteViewHierarchy = !partial; return ViewEngineResult.Found(viewName, view); } diff --git a/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewEngineTest.cs b/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewEngineTest.cs index 65f9b13d79..94701b0ddb 100644 --- a/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewEngineTest.cs +++ b/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewEngineTest.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using Microsoft.AspNet.Http; using Microsoft.AspNet.Mvc.Rendering; using Microsoft.AspNet.Routing; +using Microsoft.Framework.DependencyInjection; using Moq; using Xunit; @@ -175,11 +176,20 @@ namespace Microsoft.AspNet.Mvc.Razor.Test { // Arrange var pageFactory = new Mock(); + var page = Mock.Of(); pageFactory.Setup(p => p.CreateInstance(It.IsAny())) .Returns(Mock.Of()); + + var serviceProvider = new Mock(); + serviceProvider.Setup(p => p.GetService(typeof(IRazorPageFactory))) + .Returns(pageFactory.Object); + serviceProvider.Setup(p => p.GetService(typeof(IRazorPageActivator))) + .Returns(Mock.Of()); + serviceProvider.Setup(p => p.GetService(typeof(IViewStartProvider))) + .Returns(Mock.Of()); var viewEngine = new RazorViewEngine(pageFactory.Object, - Mock.Of(), - Mock.Of()); + new TypeActivator(), + serviceProvider.Object); var context = GetActionContext(_controllerTestContext); // Act @@ -198,8 +208,8 @@ namespace Microsoft.AspNet.Mvc.Razor.Test .Returns(null); var viewEngine = new RazorViewEngine(pageFactory.Object, - Mock.Of(), - Mock.Of()); + Mock.Of(), + Mock.Of()); return viewEngine; } diff --git a/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewTest.cs b/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewTest.cs index acc9b39ed2..0e0ede1156 100644 --- a/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewTest.cs +++ b/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewTest.cs @@ -28,8 +28,7 @@ namespace Microsoft.AspNet.Mvc.Razor var view = new RazorView(Mock.Of(), Mock.Of(), CreateViewStartProvider(), - page, - executeViewHierarchy: false); + page); var viewContext = CreateViewContext(view); var expected = viewContext.Writer; @@ -56,8 +55,7 @@ namespace Microsoft.AspNet.Mvc.Razor var view = new RazorView(Mock.Of(), activator.Object, CreateViewStartProvider(), - page, - executeViewHierarchy: false); + page); var viewContext = CreateViewContext(view); var expectedWriter = viewContext.Writer; activator.Setup(a => a.Activate(page, It.IsAny())) @@ -87,8 +85,7 @@ namespace Microsoft.AspNet.Mvc.Razor var view = new RazorView(Mock.Of(), activator.Object, CreateViewStartProvider(), - page, - executeViewHierarchy: false); + page); var viewContext = CreateViewContext(view); // Act @@ -110,8 +107,7 @@ namespace Microsoft.AspNet.Mvc.Razor var view = new RazorView(pageFactory.Object, Mock.Of(), viewStartProvider, - page, - executeViewHierarchy: false); + page); var viewContext = CreateViewContext(view); // Act @@ -134,8 +130,10 @@ namespace Microsoft.AspNet.Mvc.Razor var view = new RazorView(Mock.Of(), Mock.Of(), CreateViewStartProvider(), - page, - executeViewHierarchy: true); + page) + { + ExecuteViewHierarchy = true + }; var viewContext = CreateViewContext(view); var original = viewContext.Writer; @@ -158,8 +156,10 @@ namespace Microsoft.AspNet.Mvc.Razor var view = new RazorView(Mock.Of(), Mock.Of(), CreateViewStartProvider(), - page, - executeViewHierarchy: true); + page) + { + ExecuteViewHierarchy = true + }; var viewContext = CreateViewContext(view); var original = viewContext.Writer; @@ -184,8 +184,11 @@ namespace Microsoft.AspNet.Mvc.Razor var view = new RazorView(Mock.Of(), activator.Object, CreateViewStartProvider(), - page, - executeViewHierarchy: true); + page) + { + ExecuteViewHierarchy = true + }; + var viewContext = CreateViewContext(view); // Act @@ -226,8 +229,10 @@ namespace Microsoft.AspNet.Mvc.Razor var view = new RazorView(Mock.Of(), activator.Object, CreateViewStartProvider(viewStart1, viewStart2), - page, - executeViewHierarchy: true); + page) + { + ExecuteViewHierarchy = true + }; var viewContext = CreateViewContext(view); // Act @@ -281,8 +286,10 @@ foot-content"; var view = new RazorView(pageFactory.Object, activator.Object, CreateViewStartProvider(), - page, - executeViewHierarchy: true); + page) + { + ExecuteViewHierarchy = true + }; var viewContext = CreateViewContext(view); // Act @@ -315,8 +322,10 @@ foot-content"; var view = new RazorView(pageFactory.Object, Mock.Of(), CreateViewStartProvider(), - page, - executeViewHierarchy: true); + page) + { + ExecuteViewHierarchy = true + }; var viewContext = CreateViewContext(view); // Act and Assert @@ -342,8 +351,10 @@ foot-content"; var view = new RazorView(pageFactory.Object, Mock.Of(), CreateViewStartProvider(), - page, - executeViewHierarchy: true); + page) + { + ExecuteViewHierarchy = true + }; var viewContext = CreateViewContext(view); // Act and Assert @@ -397,8 +408,10 @@ body-content"; var view = new RazorView(pageFactory.Object, Mock.Of(), CreateViewStartProvider(), - page, - executeViewHierarchy: true); + page) + { + ExecuteViewHierarchy = true + }; var viewContext = CreateViewContext(view); // Act