2012-08-23 42 views
10

Tengo una aplicación mixta MVC 4, donde algunos controladores son implementaciones regulares de Controller y algunos controladores son implementaciones de ApiController. También estoy usando Autofac para DI, pero parece que el mecanismo "activador" del controlador WebApi (a falta de un término más específico) no está utilizando el resolvedor Autofac (AutofacWebApiDependencyResolver), lo que conduce a una excepción que se lanza cuando hago una solicitud contra uno de mis controladores de API. Aquí está el error:MVC WebApi no usa AutofacWebApiDependencyResolver

<Error> 
    <Message>An error has occurred.</Message> 
    <ExceptionMessage> 
     Type 'MyApp.Areas.Api.Controllers.MyController' does not have a default constructor 
    </ExceptionMessage> 
    <ExceptionType>System.ArgumentException</ExceptionType> 
    <StackTrace> 
     at System.Linq.Expressions.Expression.New(Type type) 
     at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) 
     at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator) 
     at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 
    </StackTrace> 
</Error> 

Así es como lo configuro:

DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); 

Mi comprensión de las integraciones Autofac.WebApi es que lo anterior es el único requisito para obtener WebAPI a utilizar el sistema de resolución Autofac, Entonces, ¿qué podría estar pasando?

nota al margen: La única parte de esta tonta que se me ocurre que podría tener rodamiento es que no tengo los controladores WebAPI en un área MVC que no está soportada por el DefaultHttpControllerSelector, por lo que implementa uno personalizado (vis -à-vis Andrew Malkov). Sin embargo, no intuyo que esto tendría alguna relación con el resolvedor, porque el selector solo devuelve un tipo que luego se usa en la activación.

+1

Ha registrado su controladores WebAPI en su ContainerBuilder con los 'builder.RegisterApiControllers (Assembly.GetExecutingAssembly()); 'CALL método? – nemesv

+0

@nemesv ¡Gracias! Eso es lo que había olvidado. Escribe tu comentario como respuesta y lo aceptaré. –

Respuesta

17

Para configurar Autofac para Web.API que tiene que hacer dos cosas:

  1. Registrar el solucionador de dependencias Autofac (en el App_Start):

    GlobalConfiguration.Configuration.DependencyResolver = 
        new AutofacWebApiDependencyResolver(container); 
    
  2. Y registre sus controladores Api en su generador de contenedores con la llamada:

    containerBuilder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 
    
+0

esto me ayuda con un problema similar. Gracias –