【问题标题】:MVC WebApi not using AutofacWebApiDependencyResolverMVC WebApi 不使用 AutofacWebApiDependencyResolver
【发布时间】:2012-08-24 14:30:39
【问题描述】:

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

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

【问题讨论】:

  • 您是否在 ContainerBuilder 中使用 builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 方法调用注册了 WebApi 控制器?
  • @nemesv 谢谢!那是我忘记的。写下您的评论作为答案,我会接受。

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


【解决方案1】:

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

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

    GlobalConfiguration.Configuration.DependencyResolver = 
        new AutofacWebApiDependencyResolver(container);
    
  2. 并通过调用在容器构建器中注册您的 Api 控制器:

    containerBuilder.RegisterApiControllers(Assembly.GetExecutingAssembly());
    

【讨论】:

    【解决方案2】:

    【讨论】:

    • 谢谢,但那篇文章只是重复了对我已经做过的事情的更彻底的解释。这本身很有用,但它并没有真正为我移动球。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    相关资源
    最近更新 更多