2012-08-23 10 views
10

Ho un'app mista MVC 4, in cui alcuni controller sono implementazioni regolari di Controller e alcuni controller sono implementazioni di ApiController. Sto anche usando Autofac per DI, ma sembra che il macchinario "attivatore" del controller WebApi (per mancanza di un termine più specifico) non stia usando il resolver Autofac (AutofacWebApiDependencyResolver), il che porta a un'eccezione che viene lanciata quando faccio un richiesta contro uno dei miei controller API. Ecco l'errore:MVC WebApi che non utilizza 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> 

Ecco come impostare il tutto:

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

mia comprensione delle integrazioni Autofac.WebApi è che quanto sopra è l'unico requisito per ottenere WebAPI di utilizzare il resolver Autofac, quindi cosa potrebbe succedere?

nota a margine: L'unica parte goofy questo che mi viene in mente che potrebbe avere portante è che non ho controllori WebAPI in una zona MVC che non è supportato dal DefaultHttpControllerSelector, quindi implementato uno personalizzato (vis -à-vis Andrew Malkov). Non intuisco che questo avrebbe alcun rapporto con il resolver, però, perché il selettore restituisce solo un tipo che viene successivamente utilizzato nell'attivazione.

+1

Non sei iscritto i controller WebAPI nel ContainerBuilder con i 'builder.RegisterApiControllers (Assembly.GetExecutingAssembly)(); il metodo di chiamata'? – nemesv

+0

@nemesv Grazie! Questo è quello che avevo dimenticato. Scrivi il tuo commento come risposta e lo accetterò. –

risposta

17

Per impostare Autofac per Web.API è necessario fare due cose:

  1. Registrati la dipendenza resolver Autofac (nella App_Start):

    GlobalConfiguration.Configuration.DependencyResolver = 
        new AutofacWebApiDependencyResolver(container); 
    
  2. e registrare il controller API nel costruttore contenitore con la chiamata:

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

questo mi aiuta con problemi simili. Grazie –

Problemi correlati