Подтвердить что ты не робот

MVC WebApi не использует AutofacWebApiDependencyResolver

У меня есть смешанное приложение MVC 4, где некоторые контроллеры являются регулярными реализациями Controller, а некоторые контроллеры - реализациями ApiController. Я также использую Autofac для DI, но, похоже, что механизм "активатора" контроллера WebApi (из-за отсутствия более конкретного термина) не использует распознаватель Autofac (AutofacWebApiDependencyResolver), что приводит к тому, что исключение бросается, когда я сделайте запрос против одного из моих контроллеров api. Здесь ошибка:

<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>

Вот как я его установил:

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

Мое понимание интеграции Autofac.WebApi заключается в том, что вышеизложенное является единственным требованием для использования WebApi для использования распознавателя Autofac, так что может происходить?

side note: Единственная тупиковая часть этого, о которой я могу думать, может иметь отношение к тому, что у меня есть контроллеры WebApi в области MVC, которые не поддерживаются DefaultHttpControllerSelector, поэтому реализована пользовательская (vis- à-vis Андрей Малков). Я не думаю, что это повлияет на распознаватель, потому что селектор возвращает только тип, который позже используется при активации.

4b9b3361

Ответ 1

Чтобы настроить Autofac для Web.API, вам нужно сделать две вещи:

  • Зарегистрируйте преобразователь зависимостей Autofac (в App_Start):

    GlobalConfiguration.Configuration.DependencyResolver = 
        new AutofacWebApiDependencyResolver(container);
    
  • И зарегистрируйте контроллеры Api в своем контейнере с вызовом:

    containerBuilder.RegisterApiControllers(Assembly.GetExecutingAssembly());