MVC WebApi不使用AutofacWebApiDependencyResolver

时间:2012-08-23 19:00:50

标签: asp.net-mvc asp.net-web-api autofac

我有一个混合的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解析器的唯一要求,那么可能会发生什么?

旁注:我能想到的唯一一个愚蠢的部分可能就是我在MVC区域中有WebApi控制器,DefaultHttpControllerSelector不支持,所以实现了一个自定义的(相对于Andrew Malkov)。但是,我并不认为这会对解析器产生任何影响,因为选择器只返回一个稍后用于激活的类型。

2 个答案:

答案 0 :(得分:17)

要为Web.API设置Autofac,您需要做两件事:

  1. 注册Autofac依赖关系解析器(在App_Start中):

    GlobalConfiguration.Configuration.DependencyResolver = 
        new AutofacWebApiDependencyResolver(container);
    
  2. 使用以下呼叫在您的容器构建器中注册您的Api控制器:

    containerBuilder.RegisterApiControllers(Assembly.GetExecutingAssembly());
    

答案 1 :(得分:1)