2012-08-23 13 views
10

Mam mieszaną aplikację MVC 4, w której niektóre kontrolery są regularnymi implementacjami Controller, a niektóre kontrolery są implementacjami ApiController. Używam również Autofac dla DI, ale wygląda na to, że mechanizm "aktywatora" kontrolera WebApi (z braku na bardziej szczegółowy termin) nie używa Autofac resolver (AutofacWebApiDependencyResolver), co prowadzi do wyjątku, który jest rzucany, gdy robię zażądać od jednego z moich kontrolerów APi. Tutaj jest błąd:MVC WebApi nie używa 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> 

Oto jak go ustawić:

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

Moje rozumienie integracji Autofac.WebApi jest to, że powyższe jest jedynym wymogiem uzyskania WebAPI używać resolverowi Autofac, więc co może się dziać?

dygresja: Jedynym głupkowaty częścią tego, że mogę myśleć, że może mieć wpływ to, że mam kontrolerów WebAPI w obszarze MVC, który nie jest obsługiwany przez DefaultHttpControllerSelector, więc wprowadziła zwyczaj jedną (vis -a-vis Andrew Malkov). Nie wyczuwam jednak, że będzie to miało jakikolwiek wpływ na przelicznik, ponieważ selektor zwraca tylko typ, który jest później używany w aktywacji.

+1

Czy zarejestrowany kontrolerów WebAPI w swojej ContainerBuilder z 'builder.RegisterApiControllers (Assembly.GetExecutingAssembly());' wywołanie metody? – nemesv

+0

@nemesv Dziekujemy! Właśnie o tym zapomniałem. Napisz swój komentarz jako odpowiedź, a ja to zaakceptuję. –

Odpowiedz

17

Aby skonfigurować Autofac dla Web.API trzeba zrobić dwie rzeczy:

  1. Zarejestruj zależnościach resolverowi Autofac (w App_Start):

    GlobalConfiguration.Configuration.DependencyResolver = 
        new AutofacWebApiDependencyResolver(container); 
    
  2. i zarejestrować kontrolery API w swoim budowniczym pojemnika z wezwaniem:

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

to pomaga mi z podobnym problemem. dzięki –

Powiązane problemy