¿Alguien ha tenido éxito al ejecutar un contenedor IoC para inyectar dependencias en los controladores ASP.NET WebAPI? Parece que no puedo hacer que funcione.
Esto es lo que estoy haciendo ahora.
En mi global.ascx.cs
:
public static void RegisterRoutes(RouteCollection routes)
{
// code intentionally omitted
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
IUnityContainer container = BuildUnityContainer();
System.Web.Http.GlobalConfiguration.Configuration.ServiceResolver.SetResolver(
t =>
{
try
{
return container.Resolve(t);
}
catch (ResolutionFailedException)
{
return null;
}
},
t =>
{
try
{
return container.ResolveAll(t);
}
catch (ResolutionFailedException)
{
return new System.Collections.Generic.List<object>();
}
});
System.Web.Mvc.ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory(container));
BundleTable.Bundles.RegisterTemplateBundles();
}
private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer().LoadConfiguration();
return container;
}
Mi fábrica de controladores:
public class UnityControllerFactory : DefaultControllerFactory
{
private IUnityContainer _container;
public UnityControllerFactory(IUnityContainer container)
{
_container = container;
}
public override IController CreateController(System.Web.Routing.RequestContext requestContext,
string controllerName)
{
Type controllerType = base.GetControllerType(requestContext, controllerName);
return (IController)_container.Resolve(controllerType);
}
}
Nunca parece buscar en mi archivo de unidad para resolver dependencias, y obtengo un error como:
Se produjo un error al intentar crear un controlador de tipo 'PersonalShopper.Services.WebApi.Controllers.ShoppingListController'. Asegúrese de que el controlador tenga un constructor público sin parámetros.
en System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (HttpControllerContext controllerContext, Type controllerType) en System.Web.Http.Dispatcher.DefaultHttpControllerFactory.CreateInstance (HttpControllerContext controllerContext, HttpControllerHttpController.Controller, HttpController. (HttpControllerContext controllerContext, String controllerName) en System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal (solicitud HttpRequestMessage, CancellationToken cancellationToken) en System.Web.Http.Dispatcher.HttpControllerDispatlation request, CancellationTokenlation
El controlador se parece a:
public class ShoppingListController : System.Web.Http.ApiController
{
private Repositories.IProductListRepository _ProductListRepository;
public ShoppingListController(Repositories.IUserRepository userRepository,
Repositories.IProductListRepository productListRepository)
{
_ProductListRepository = productListRepository;
}
}
Mi archivo de unidad se ve así:
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<container>
<register type="PersonalShopper.Repositories.IProductListRepository, PersonalShopper.Repositories" mapTo="PersonalShopper.Implementations.MongoRepositories.ProductListRepository, PersonalShopper.Implementations" />
</container>
</unity>
Tenga en cuenta que no tengo un registro para el controlador en sí porque en versiones anteriores de mvc, la fábrica de controladores se daría cuenta de que las dependencias debían resolverse.
Parece que nunca se llama a la fábrica de mi controlador.
GlobalConfiguration.Configuration.ServiceResolver.SetResolver()
?