Skip to content
This repository was archived by the owner on Dec 14, 2018. It is now read-only.

Remove constructor injection from TagHelper creation. #1307

Merged
merged 1 commit into from
Oct 9, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 3 additions & 19 deletions src/Microsoft.AspNet.Mvc.Razor/RazorPage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ public abstract class RazorPage : IRazorPage
private readonly Stack<TextWriter> _writerScopes;
private TextWriter _originalWriter;
private IUrlHelper _urlHelper;
private ITypeActivator _typeActivator;
private ITagHelperActivator _tagHelperActivator;
private bool _renderedBody;

Expand Down Expand Up @@ -114,19 +113,6 @@ public dynamic ViewBag
/// <inheritdoc />
public abstract Task ExecuteAsync();

private ITypeActivator TypeActivator
{
get
{
if(_typeActivator == null)
{
_typeActivator = ViewContext.HttpContext.RequestServices.GetService<ITypeActivator>();
}

return _typeActivator;
}
}

private ITagHelperActivator TagHelperActivator
{
get
Expand All @@ -139,19 +125,17 @@ private ITagHelperActivator TagHelperActivator
return _tagHelperActivator;
}
}

/// <summary>
/// Creates and activates a <see cref="ITagHelper"/>.
/// </summary>
/// <typeparam name="TTagHelper">A <see cref="ITagHelper"/> type.</typeparam>
/// <returns>The activated <see cref="ITagHelper"/>.</returns>
/// <remarks>
/// If the <see cref= "ITagHelper" /> implements <see cref="ICanHasViewContext"/> the
/// <see cref="ICanHasViewContext.Contextualize(ViewContext)"/> method is called with <see cref="ViewContext"/>.
/// <typeparamref name="TTagHelper"/> must have a parameterless constructor.
/// </remarks>
public TTagHelper CreateTagHelper<TTagHelper>() where TTagHelper : ITagHelper
public TTagHelper CreateTagHelper<TTagHelper>() where TTagHelper : ITagHelper, new()
{
var tagHelper = TypeActivator.CreateInstance<TTagHelper>(ViewContext.HttpContext.RequestServices);
var tagHelper = new TTagHelper();

TagHelperActivator.Activate(tagHelper, ViewContext);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using System.Globalization;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNet.Http;
Expand All @@ -18,56 +19,48 @@ namespace Microsoft.AspNet.Mvc.Razor
public class RazorPageCreateTagHelperTest
{
[Fact]
public void CreateTagHelper_CreatesProvidedTagHelperType()
{
// Arrange
var instance = CreateTestRazorPage();

// Act
var tagHelper = instance.CreateTagHelper<NoServiceTagHelper>();

// Assert
Assert.NotNull(tagHelper);
}

[Fact]
public void CreateTagHelper_ActivatesProvidedTagHelperType_Constructor()
public void CreateTagHelper_ThrowsIfNoParameterlessConstructor()
{
// Arrange
var instance = CreateTestRazorPage();
var expectedErrorMessage = string.Format(
CultureInfo.InvariantCulture,
"Tag helper `{0}` must have a public paramterless constructor.",
typeof(NoParameterlessConstructor).FullName);

// Act
var tagHelper = instance.CreateTagHelper<ConstructorServiceTagHelper>();
// Act & Assert
var ex = Assert.Throws<MissingMethodException>(() =>
{
instance.CreateTagHelper<NoParameterlessConstructor>();
});

// Assert
Assert.NotNull(tagHelper.PassedInService);
Assert.Equal(expectedErrorMessage, ex.Message);
}

[Fact]
public void CreateTagHelper_ActivatesProvidedTagHelperType_Property()
public void CreateTagHelper_CreatesProvidedTagHelperType()
{
// Arrange
var instance = CreateTestRazorPage();

// Act
var tagHelper = instance.CreateTagHelper<ActivateAttributeServiceTagHelper>();
var tagHelper = instance.CreateTagHelper<NoServiceTagHelper>();

// Assert
Assert.NotNull(tagHelper.ActivatedService);
Assert.NotNull(tagHelper);
}

[Fact]
public void CreateTagHelper_ActivatesProvidedTagHelperType_PropertyAndConstructor()
public void CreateTagHelper_ActivatesProvidedTagHelperType()
{
// Arrange
var instance = CreateTestRazorPage();

// Act
var tagHelper = instance.CreateTagHelper<AttributeConstructorServiceTagHelper>();
var tagHelper = instance.CreateTagHelper<ServiceTagHelper>();

// Assert
Assert.NotNull(tagHelper.ActivatedService);
Assert.NotNull(tagHelper.PassedInService);
}

[Fact]
Expand All @@ -94,7 +87,7 @@ public void CreateTagHelper_ProvidesTagHelperTypeWithViewContextAndActivates()

// Assert
Assert.NotNull(tagHelper.ViewContext);
Assert.NotNull(tagHelper.PassedInService);
Assert.NotNull(tagHelper.ActivatedService);
}

private static TestRazorPage CreateTestRazorPage()
Expand Down Expand Up @@ -138,33 +131,10 @@ private class NoServiceTagHelper : TagHelper
{
}

private class ConstructorServiceTagHelper : TagHelper
{
public MyService PassedInService { get; set; }

public ConstructorServiceTagHelper(MyService service)
{
PassedInService = service;
}
}

private class ActivateAttributeServiceTagHelper : TagHelper
{
[Activate]
public MyService ActivatedService { get; set; }
}

private class AttributeConstructorServiceTagHelper : TagHelper
private class ServiceTagHelper : TagHelper
{
[Activate]
public MyService ActivatedService { get; set; }

public MyService PassedInService { get; set; }

public AttributeConstructorServiceTagHelper(MyService service)
{
PassedInService = service;
}
}

private class ViewContextTagHelper : TagHelper
Expand All @@ -175,11 +145,14 @@ private class ViewContextTagHelper : TagHelper

private class ViewContextServiceTagHelper : ViewContextTagHelper
{
public MyService PassedInService { get; set; }
[Activate]
public MyService ActivatedService { get; set; }
}

public ViewContextServiceTagHelper(MyService service)
private class NoParameterlessConstructor : TagHelper
{
public NoParameterlessConstructor(string a)
{
PassedInService = service;
}
}

Expand Down