aspnetcore/src/Microsoft.AspNet.Mvc/DefaultControllerFactory.cs

65 lines
2.2 KiB
C#

using System;
using System.Linq;
using System.Reflection;
using Microsoft.AspNet.Abstractions;
using Microsoft.AspNet.DependencyInjection;
namespace Microsoft.AspNet.Mvc
{
public class DefaultControllerFactory : IControllerFactory
{
private readonly IServiceProvider _serviceProvider;
private readonly IControllerDescriptorProvider _controllerDescriptorProvider;
public DefaultControllerFactory(IServiceProvider serviceProvider, IControllerDescriptorProvider controllerDescriptorProvider)
{
_serviceProvider = serviceProvider;
_controllerDescriptorProvider = controllerDescriptorProvider;
}
public object CreateController(HttpContext context, string controllerName)
{
var controllers = _controllerDescriptorProvider.GetControllers(controllerName);
if (controllers != null)
{
try
{
var descriptor = controllers.SingleOrDefault();
if (descriptor != null)
{
try
{
var controller = ActivatorUtilities.CreateInstance(_serviceProvider, descriptor.ControllerType);
// TODO: How do we feed the controller with context (need DI improvements)
var contextProperty = descriptor.ControllerType.GetRuntimeProperty("Context");
if (contextProperty != null)
{
contextProperty.SetMethod.Invoke(controller, new object[] { context });
}
return controller;
}
catch (ReflectionTypeLoadException)
{
}
}
}
catch (InvalidOperationException)
{
throw new InvalidOperationException("Ambiguity: Duplicate controllers match the controller name");
}
}
return null;
}
public void ReleaseController(object controller)
{
}
}
}