2012-08-23 58 views
10

我有一個混合的MVC 4應用程序,其中一些控制器是Controller的常規實現,一些控制器是ApiController的實現。我也使用Autofac進行DI,但似乎WebApi控制器「激活」機器(缺乏更具體的術語)沒有使用Autofac解析器(AutofacWebApiDependencyResolver),這導致了當我做出一個異常時請求我的一個api控制器。這裏的錯誤:MVC WebApi不使用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> 

以下是我設置它:

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

我的Autofac.WebApi集成的理解是,上面的是獲得的WebAPI使用Autofac解析器的唯一要求,所以可能會發生什麼?

側面說明:這樣做的唯一的愚蠢的一部分,我能想到的,可能有軸承是,我有在不被DefaultHttpControllerSelector支持的MVC區的WebAPI控制器,所以實現了自定義一個(相-d-vis Andrew Malkov)。不過,我並不認爲這對解析器有任何影響,因爲選擇器只返回一個稍後用於激活的類型。

+1

你有沒有註冊在ContainerBuilder您的WebAPI控制器用'builder.RegisterApiControllers(Assembly.GetExecutingAssembly());'方法調用? – nemesv

+0

@nemesv謝謝!那是我忘記的。寫下您的評論作爲答案,我會接受它。 –

回答

17

要設置Autofac爲Web.API你需要做兩兩件事:

  1. 註冊Autofac依賴解析器(在App_Start):

    GlobalConfiguration.Configuration.DependencyResolver = 
        new AutofacWebApiDependencyResolver(container); 
    
  2. 並註冊您的Api控制器在您的容器生成器中的呼叫:

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

這可以幫助我解決類似的問題。謝謝 –