Fix for #996 - ViewComponentInvoker should get TypeActivator from DI.

This commit is contained in:
Ryan Nowak 2014-10-23 13:48:11 -07:00
parent 7ae5e66ccd
commit 7012b3fc2b
2 changed files with 17 additions and 7 deletions

View File

@ -14,17 +14,20 @@ namespace Microsoft.AspNet.Mvc
public class DefaultViewComponentInvoker : IViewComponentInvoker
{
private readonly IServiceProvider _serviceProvider;
private readonly ITypeActivator _activator;
private readonly TypeInfo _componentType;
private readonly IViewComponentActivator _viewComponentActivator;
private readonly object[] _args;
public DefaultViewComponentInvoker(
[NotNull] IServiceProvider serviceProvider,
[NotNull] ITypeActivator activator,
[NotNull] IViewComponentActivator viewComponentActivator,
[NotNull] TypeInfo componentType,
object[] args)
{
_serviceProvider = serviceProvider;
_activator = activator;
_componentType = componentType;
_viewComponentActivator = viewComponentActivator;
_args = args ?? new object[0];
@ -74,8 +77,7 @@ namespace Microsoft.AspNet.Mvc
private object CreateComponent([NotNull] ViewContext context)
{
var activator = _serviceProvider.GetRequiredService<ITypeActivator>();
var component = activator.CreateInstance(_serviceProvider, _componentType.AsType());
var component = _activator.CreateInstance(_serviceProvider, _componentType.AsType());
_viewComponentActivator.Activate(component, context);
return component;
}

View File

@ -2,19 +2,23 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.AspNet.Mvc.Core;
using Microsoft.Framework.DependencyInjection;
namespace Microsoft.AspNet.Mvc
{
public class DefaultViewComponentInvokerProvider : IViewComponentInvokerProvider
{
private readonly IServiceProvider _serviceProvider;
private readonly ITypeActivator _typeActivator;
private readonly IViewComponentActivator _viewComponentActivator;
public DefaultViewComponentInvokerProvider(IServiceProvider serviceProvider,
public DefaultViewComponentInvokerProvider(
IServiceProvider serviceProvider,
ITypeActivator typeActivator,
IViewComponentActivator viewComponentActivator)
{
_serviceProvider = serviceProvider;
_typeActivator = typeActivator;
_viewComponentActivator = viewComponentActivator;
}
@ -25,9 +29,13 @@ namespace Microsoft.AspNet.Mvc
public void Invoke([NotNull] ViewComponentInvokerProviderContext context, [NotNull] Action callNext)
{
context.Result =
new DefaultViewComponentInvoker(
_serviceProvider, _viewComponentActivator, context.ComponentType, context.Arguments);
context.Result = new DefaultViewComponentInvoker(
_serviceProvider,
_typeActivator,
_viewComponentActivator,
context.ComponentType,
context.Arguments);
callNext();
}
}