2012-07-14 12 views
51

ASP .NET MVCとASP .NET Web Apiで動作するようにAutofacを設定することは可能ですか?依存関係のリゾルバが違うことは承知しています。しかし、文書化されたアプローチを使用する場合、グローバルリゾルバは1つしか設定できません。ASP.NET MVCとASP.NET Web APIで動作するようにAutofacを設定することはできます

// Set the dependency resolver implementation. 
GlobalConfiguration.Configuration.DependencyResolver = resolver; 

このアプローチは悪い考えですか?自分のソリューションを2つのプロジェクトに分け、それぞれの依存関係注入を処理する必要がありますか?

+0

私はここで最小限の実装をしています:http://byterot.blogspot.co.uk/2012/04/aspnet-web-api-series-part-4-dependency.html – Aliostad

答えて

82

AutofacがMVCとWeb APIの両方で動作するように設定します。これは非常に一般的なシナリオであると予想されます。 MVCとWeb APIは互いに独立して使用できるので、2つの独立した依存リゾルバ実装があります。同じことがAutofacの統合にも当てはまります。

MVCとWeb APIの両方を同じアプリケーションで使用する場合は、それぞれ独自の依存関係リゾルバが必要ですが、コンテナの同じインスタンスを使用することもできます。

var builder = new ContainerBuilder(); 

// Add your registrations 

var container = builder.Build(); 

// Set the dependency resolver for Web API. 
var webApiResolver = new AutofacWebApiDependencyResolver(container); 
GlobalConfiguration.Configuration.DependencyResolver = webApiResolver; 

// Set the dependency resolver for MVC. 
var mvcResolver = new AutofacDependencyResolver(container); 
DependencyResolver.SetResolver(mvcResolver); 

InstancePerApiRequestInstancePerHttpRequest寿命スコープは今、同じタグを共有するため、2つの間の登録を共有することも可能です。

Web APIとMVCの依存関係リゾルバを設定するメカニズムが異なることに注意してください。 Web APIはGlobalConfiguration.Configuration.DependencyResolverを使用し、MVCはDependencyResolver.SetResolverを使用します。

+0

すばらしい答え。唯一のことは、MVCとWeb APIが互いに独立して使用できるためです。 "私は2つの異なるランタイムを持っているため、autofacにはmvcとwebapiの2つのプラグインがあります。 – anIBMer

+0

WebApiは、言うまでもなく 'GlobalConfiguration'を使用せず、' HttpConfiguration'を使用しています。これは、owinベースのプロジェクトの場合、単にインスタンス化して使用することができます: 'config.DependencyResolver = new AutofacWebApiDependencyResolver(...)'。キキーフより –

4

確実に区別してください。 AutofacにはASP.NET MVCASP.NET Web APIの両方の統合があります。これは必ずしも当てはまるわけではありませんが、両方のアプリケーションで同じサービスが必要な場合は、おそらくアプリケーションアーキテクチャに問題があります。ここで

を使用すると、ASP.NETのWeb APIでこれを行う方法です。そして、

internal class AutofacWebAPI { 

    public static void Initialize(HttpConfiguration config) { 

     config.DependencyResolver = new AutofacWebApiDependencyResolver(
      RegisterServices(new ContainerBuilder()) 
     ); 
    } 

    private static IContainer RegisterServices(ContainerBuilder builder) { 

     builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).PropertiesAutowired(); 

     //deal with your dependencies here 
     builder.RegisterType<CarsService>().As<ICarsService>(); 
     builder.RegisterType<CarsCountService>().As<ICarsCountService>(); 

     return builder.Build(); 
    } 
} 

、以下のようにGlobal.asax.csの内側にこれを登録します。それは確かに可能である

AutofacWebAPI.Initialize(GlobalConfiguration.Configuration); 
+1

それは本当です。同じプロジェクト内でフロントエンドとサービスの設定を分ける方がよいでしょう。 –

11

は私がmvc5やWeb APIでこれで苦労したものが2

まずnugetパッケージ

  • を追加少し助けAutofac
  • Autofacのasp.netのMVC 5統合
  • を追加しようと思いました
  • Autofac asp.net web api 2。X統合グローバルのApplication_Startで追加(またはapp_startクラスなど)で

以下のクラスに呼び出しを追加

AutofacConfig.RegisterAutoFac(); 

は今、それぞれの新しいのために今からApp_start

using System.Reflection; 
using System.Web.Http; 
using System.Web.Http.Controllers; 
using System.Web.Mvc; 
using Autofac; 
using Autofac.Integration.Mvc; 
using Autofac.Integration.WebApi; 

namespace Example1.Web 
{ 
    public class AutofacConfig 
    { 
     public static IContainer RegisterAutoFac() 
     { 
      var builder = new ContainerBuilder(); 

      AddMvcRegistrations(builder); 
      AddRegisterations(builder); 

      var container = builder.Build(); 

      DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
      GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); 

      return container; 
     } 

     private static void AddMvcRegistrations(ContainerBuilder builder) 
     { 
      //mvc 
      builder.RegisterControllers(Assembly.GetExecutingAssembly()); 
      builder.RegisterAssemblyModules(Assembly.GetExecutingAssembly()); 
      builder.RegisterModelBinders(Assembly.GetExecutingAssembly()); 
      builder.RegisterModelBinderProvider(); 

      //web api 
      builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).PropertiesAutowired(); 
      builder.RegisterModule<AutofacWebTypesModule>(); 
     } 

     private static void AddRegisterations(ContainerBuilder builder) 
     { 
      //builder.RegisterModule(new MyCustomerWebAutoFacModule()); 
     } 
    } 
} 

の下で、このクラスを追加しますアセンブリを追加すると、新しいモジュールが追加され、AddRegisterations関数にモジュールが登録されます(例を示します)

私はコンテナを返送しましたが、これは必要ありません。

これはモジュールの現在のアセンブリをスキャンします。したがって、AddRegisterationsにローカルモジュールを追加しないと、すべてを2回登録します。

+1

。最後に誰かがここにそれを置いているだけで、簡単な意見を付けることなく簡単に理解することができます。 – punkologist

関連する問題