10

混合MVC4アプリがあり、一部のコントローラーはの通常の実装でControllerあり、一部のコントローラーはの実装ですApiController。私もDIにAutofacを使用していますが、WebApiコントローラーの「アクティベーター」機構(より具体的な用語がないため)がAutofacリゾルバー(AutofacWebApiDependencyResolver)を使用していないようです。これにより、リクエストを行うと例外がスローされます。私のAPIコントローラーの1つに対して。エラーは次のとおりです。

<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に対して) 。ただし、セレクターは後でアクティブ化に使用されるタイプのみを返すため、これがリゾルバーに影響を与えるとは思いません。

4

2 に答える 2

17

Autofac for Web.APIを設定するには、次の2つのことを行う必要があります。

  1. Autofac依存関係リゾルバーを(App_Startに)登録します。

    GlobalConfiguration.Configuration.DependencyResolver = 
        new AutofacWebApiDependencyResolver(container);
    
  2. そして、呼び出しでコンテナビルダーにApiコントローラーを登録します。

    containerBuilder.RegisterApiControllers(Assembly.GetExecutingAssembly());
    
于 2012-08-24T06:30:39.727 に答える
1

おそらくこのブログはあなたを助けることができます:http: //blogs.msdn.com/b/roncain/archive/2012/07/16/dependency-injection-with-asp-net-web-api-and-autofac.aspx

于 2012-08-23T20:26:05.940 に答える