Modify RazorView to be instantiated via TypeActivator

Partial fix for #889
This commit is contained in:
Pranav K 2014-08-01 10:37:06 -07:00
parent 9e68a163fd
commit 90b40832ff
5 changed files with 70 additions and 48 deletions

View File

@ -25,7 +25,7 @@ namespace Microsoft.AspNet.Mvc.Razor
Action<TextWriter> RenderBodyDelegate { get; set; }
/// <summary>
/// Gets the path to the page.
/// Gets the application base relative path to the page.
/// </summary>
string Path { get; set; }

View File

@ -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;
/// <summary>
/// Initializes a new instance of RazorView
/// </summary>
/// <param name="page">The page to execute</param>
/// <param name="pageFactory">The view factory used to instantiate additional views.</param>
/// <param name="pageFactory">The view factory used to instantiate layout and _ViewStart pages.</param>
/// <param name="pageActivator">The <see cref="IRazorPageActivator"/> used to activate pages.</param>
/// <param name="executeViewHierarchy">A value that indiciates whether the view hierarchy that involves
/// view start and layout pages are executed as part of the executing the page.</param>
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;
}
/// <summary>
/// Gets or sets a value that determines if the view hierarchy is executed as part of
/// executing the <see cref="IRazorPage"/> instance. The view hierarchy involves _ViewStart
/// and Layout pages.</param>
public bool ExecuteViewHierarchy { get; set; }
/// <inheritdoc />
public async Task RenderAsync([NotNull] ViewContext context)
{
if (_executeViewHierarchy)
if (ExecuteViewHierarchy)
{
var bodyWriter = await RenderPageAsync(_page, context, executeViewStart: true);
await RenderLayoutAsync(context, bodyWriter);

View File

@ -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;
/// <summary>
/// Initializes a new instance of the RazorViewEngine class.
@ -41,12 +42,12 @@ namespace Microsoft.AspNet.Mvc.Razor
/// <param name="viewStartProvider">The provider used to provide instances of ViewStarts applicable to the
/// page being rendered.</param>
public RazorViewEngine(IRazorPageFactory pageFactory,
IRazorPageActivator pageActivator,
IViewStartProvider viewStartProvider)
ITypeActivator typeActivator,
IServiceProvider serviceProvider)
{
_pageFactory = pageFactory;
_pageActivator = pageActivator;
_viewStartProvider = viewStartProvider;
_typeActivator = typeActivator;
_serviceProvider = serviceProvider;
}
public IEnumerable<string> 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<RazorView>(_serviceProvider, page);
view.ExecuteViewHierarchy = !partial;
return ViewEngineResult.Found(viewName, view);
}

View File

@ -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<IRazorPageFactory>();
var page = Mock.Of<IRazorPage>();
pageFactory.Setup(p => p.CreateInstance(It.IsAny<string>()))
.Returns(Mock.Of<IRazorPage>());
var serviceProvider = new Mock<IServiceProvider>();
serviceProvider.Setup(p => p.GetService(typeof(IRazorPageFactory)))
.Returns(pageFactory.Object);
serviceProvider.Setup(p => p.GetService(typeof(IRazorPageActivator)))
.Returns(Mock.Of<IRazorPageActivator>());
serviceProvider.Setup(p => p.GetService(typeof(IViewStartProvider)))
.Returns(Mock.Of<IViewStartProvider>());
var viewEngine = new RazorViewEngine(pageFactory.Object,
Mock.Of<IRazorPageActivator>(),
Mock.Of<IViewStartProvider>());
new TypeActivator(),
serviceProvider.Object);
var context = GetActionContext(_controllerTestContext);
// Act
@ -198,8 +208,8 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
.Returns<RazorPage>(null);
var viewEngine = new RazorViewEngine(pageFactory.Object,
Mock.Of<IRazorPageActivator>(),
Mock.Of<IViewStartProvider>());
Mock.Of<ITypeActivator>(),
Mock.Of<IServiceProvider>());
return viewEngine;
}

View File

@ -28,8 +28,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
Mock.Of<IRazorPageActivator>(),
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<IRazorPageFactory>(),
activator.Object,
CreateViewStartProvider(),
page,
executeViewHierarchy: false);
page);
var viewContext = CreateViewContext(view);
var expectedWriter = viewContext.Writer;
activator.Setup(a => a.Activate(page, It.IsAny<ViewContext>()))
@ -87,8 +85,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
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<IRazorPageActivator>(),
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<IRazorPageFactory>(),
Mock.Of<IRazorPageActivator>(),
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<IRazorPageFactory>(),
Mock.Of<IRazorPageActivator>(),
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<IRazorPageFactory>(),
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<IRazorPageFactory>(),
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<IRazorPageActivator>(),
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<IRazorPageActivator>(),
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<IRazorPageActivator>(),
CreateViewStartProvider(),
page,
executeViewHierarchy: true);
page)
{
ExecuteViewHierarchy = true
};
var viewContext = CreateViewContext(view);
// Act