2012-02-26 41 views
9

He estado usando autofac con MVC 3 por un tiempo y me encanta. Hace poco actualicé un proyecto a MVC 4 y todo parece funcionar, excepto para ApiControllers de Api web. Recibo la siguiente excepción.Autofac y API web ASP.NET ApiController

An error occurred when trying to create a controller of type 'MyNamespace.Foo.CustomApiController'. Make sure that the controller has a parameterless public constructor. 

Esto me parece ser un problema con DI a través de autofac. Me estoy perdiendo algo o hay algo en las obras. Lo sé, MVC4 acaba de salir y es una versión beta, así que no espero mucho, pero pensé que podría estar perdiendo algo.

Respuesta

10

He lanzado paquetes de integración Autofac en NuGet para las versiones Beta de MVC 4 y Web API. Las integraciones crearán un alcance de vida útil Autofac por solicitud de controlador (controlador MVC o controlador API dependiendo de la integración). Esto significa que el controlador y sus dependencias se eliminarán automáticamente al final de cada llamada. Ambos paquetes se pueden instalar uno al lado del otro en el mismo proyecto.

MVC 4

https://nuget.org/packages/Autofac.Mvc4

http://alexmg.com/post/2012/03/09/Autofac-ASPNET-MVC-4-(Beta)-Integration.aspx

Web API

https://nuget.org/packages/Autofac.WebApi/

http://alexmg.com/post/2012/03/09/Autofac-ASPNET-Web-API-(Beta)-Integration.aspx

Los enlaces ya están corregidos.

+1

Desafortunadamente, a la hora de tipear este comentario, parece que usar Autofac para MVC 4 RC y Web API RC al mismo tiempo no funciona. Recibo advertencias del compilador sobre los tipos que no se encuentran en los ensamblados del marco de Web API. Tuve que usar la respuesta proporcionada por @tugberk y volver a implementar el resolvedor de dependencias para evitarlo. – NathanAldenSr

4

Acabo de configurar esto en una de mis aplicaciones. Hay diferentes maneras de hacerlo, pero me gusta este enfoque:

Autofac and ASP.NET Web API System.Web.Http.Services.IDependencyResolver Integration

En primer lugar he creado una clase que implementa la interfaz System.Web.Http.Services.IDependencyResolver.

internal class AutofacWebAPIDependencyResolver : System.Web.Http.Services.IDependencyResolver { 

    private readonly IContainer _container; 

    public AutofacWebAPIDependencyResolver(IContainer container) { 

     _container = container; 
    } 

    public object GetService(Type serviceType) { 

     return _container.IsRegistered(serviceType) ? _container.Resolve(serviceType) : null; 
    } 

    public IEnumerable<object> GetServices(Type serviceType) { 

     Type enumerableServiceType = typeof(IEnumerable<>).MakeGenericType(serviceType); 
     object instance = _container.Resolve(enumerableServiceType); 
     return ((IEnumerable)instance).Cast<object>(); 
    } 
} 

y no tengo otra clase que tiene mis registros:

internal class AutofacWebAPI { 

    public static void Initialize() { 
     var builder = new ContainerBuilder(); 
     GlobalConfiguration.Configuration.ServiceResolver.SetResolver(
      new AutofacWebAPIDependencyResolver(RegisterServices(builder)) 
     ); 
    } 

    private static IContainer RegisterServices(ContainerBuilder builder) { 

     builder.RegisterAssemblyTypes(typeof(MvcApplication).Assembly).PropertiesAutowired(); 

     builder.RegisterType<WordRepository>().As<IWordRepository>(); 
     builder.RegisterType<MeaningRepository>().As<IMeaningRepository>(); 

     return 
      builder.Build(); 
    } 
} 

Entonces, inicializarlo en Application_Start:

protected void Application_Start() { 

    //... 

    AutofacWebAPI.Initialize(); 

    //... 
} 

espero que esto ayude.

Cuestiones relacionadas