2012-02-26 4 views
9

私はしばらくの間、MVC 3でautofacを使用していました。私は最近、プロジェクトをMVC 4にアップグレードしました.Web API ApiControllerを除いてすべてが機能しているようです。私は次の例外を受け取ります。AutofacとASP.NET Web API ApiController

An error occurred when trying to create a controller of type 'MyNamespace.Foo.CustomApiController'. Make sure that the controller has a parameterless public constructor. 

これは私にDI経由の自動ファクシミリの問題と思われます。私は何かを欠いているか、または作品に何かがあるかどうか。私が知っているMVC4はちょうど出てきてベータだから、あまり期待していないが、何かが欠けているかもしれないと思った。

答えて

10

私はNuGet上で、MVC 4とWeb APIのベータ版のAutofac統合パッケージをリリースしました。インテグレーションは、コントローラー要求(統合に応じてMVCコントローラーまたはAPIコントローラー)ごとにAutofac有効期間スコープを作成します。つまり、コントローラーとその依存関係は、各呼び出しの最後に自動的に処理されます。どちらのパッケージも同じプロジェクトに並んでインストールできます。

MVC 4

https://nuget.org/packages/Autofac.Mvc4

http://alexmg.com/post/2012/03/09/Autofac-ASPNET-MVC-4-(Beta)-Integration.aspx

ウェブAPI

https://nuget.org/packages/Autofac.WebApi/

http://alexmg.com/post/2012/03/09/Autofac-ASPNET-Web-API-(Beta)-Integration.aspx

リンクが修正されました。

+1

残念ながら、このコメントの入力時には、同時にAutofac for MVC 4 RCとWeb API RCを使用しても動作しないように見えます。 Web APIフレームワークアセンブリでタイプが見つからないというコンパイラーの警告が表示されます。 @tugberkによって提供された答えを使用して、それを回避するために依存関係リゾルバを再実装する必要がありました。 – NathanAldenSr

4

私はこれを私のアプリケーションの1つで設定しました。そこにそれを行うためのさまざまな方法がありますが、私はこのアプローチを好む:

Autofac and ASP.NET Web API System.Web.Http.Services.IDependencyResolver Integration

まず私はSystem.Web.Http.Services.IDependencyResolverインタフェースを実装するクラスを作成しました。

internal class AutofacWebAPIDependencyResolver : System.Web.Http.Services.IDependencyResolver { 

    private readonly IContainer _container; 

    public AutofacWebAPIDependencyResolver(IContainer container) { 

     _container = container; 
    } 

    public object GetService(Type serviceType) { 

     return _container.IsRegistered(serviceType) ? _container.Resolve(serviceType) : null; 
    } 

    public IEnumerable<object> GetServices(Type serviceType) { 

     Type enumerableServiceType = typeof(IEnumerable<>).MakeGenericType(serviceType); 
     object instance = _container.Resolve(enumerableServiceType); 
     return ((IEnumerable)instance).Cast<object>(); 
    } 
} 

そして私は私の登録を保持している別のクラスがあります。Application_Startでそれを初期化し、その後

internal class AutofacWebAPI { 

    public static void Initialize() { 
     var builder = new ContainerBuilder(); 
     GlobalConfiguration.Configuration.ServiceResolver.SetResolver(
      new AutofacWebAPIDependencyResolver(RegisterServices(builder)) 
     ); 
    } 

    private static IContainer RegisterServices(ContainerBuilder builder) { 

     builder.RegisterAssemblyTypes(typeof(MvcApplication).Assembly).PropertiesAutowired(); 

     builder.RegisterType<WordRepository>().As<IWordRepository>(); 
     builder.RegisterType<MeaningRepository>().As<IMeaningRepository>(); 

     return 
      builder.Build(); 
    } 
} 

を:

protected void Application_Start() { 

    //... 

    AutofacWebAPI.Initialize(); 

    //... 
} 

私はこのことができます願っています。

関連する問題