AutofacをASP .NET MVCとASP .NET Web Apiで動作するように設定することは可能です。文書化されたアプローチを使用する場合、グローバルリゾルバを1つしか設定できません。
// Set the dependency resolver implementation.
GlobalConfiguration.Configuration.DependencyResolver = resolver;
このアプローチは悪い考えですか?ソリューションを2つのプロジェクトに分けて、それぞれの依存性注入を個別に処理する必要がありますか?
MVCとWeb APIの両方で動作するようにAutofacを構成することは確かに可能です。これは非常に一般的なシナリオであると予想されます。 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);
InstancePerApiRequest
およびInstancePerHttpRequest
ライフタイムスコープが同じタグを共有するようになったため、2つの間で登録を共有することも可能です。
Web APIとMVCの依存関係リゾルバーを設定するメカニズムは異なることに注意してください。 Web APIはGlobalConfiguration.Configuration.DependencyResolver
を使用し、MVCはDependencyResolver.SetResolver
を使用します。
Mvc5とweb api 2でこれに苦労している人たちに少し助けを加えると思った。
最初にnugetパッケージを追加します
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回登録します。
それらを明確に分離します。 Autofacには、 ASP.NET MVC と ASP.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);