web-dev-qa-db-ja.com

AutofacをASP.NET MVCおよびASP.NET Web Apiで動作するように構成することは可能ですか

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

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

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

57
Raúl Roa

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を使用します。

92

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回登録します。

14
Choco Smith

それらを明確に分離します。 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);
4
tugberk