2012-08-23 24 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

这可以帮助我解决类似的问题。谢谢 –