59

ASP .NET MVC および ASP .NET Web Api と連携するように Autofac を構成することは可能ですか。依存関係リゾルバーが異なることは承知しています。しかし、文書化されたアプローチを使用する場合、設定できるグローバル リゾルバーは 1 つだけです。

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

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

4

3 に答える 3

97

AutofacをMVCとWebAPIの両方で動作するように構成することは確かに可能です。これは非常に一般的なシナリオであると予想されます。MVCとWebAPIは互いに独立して使用できるため、2つの別個の依存関係リゾルバーの実装があります。同じことがAutofac統合にも当てはまります。

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

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つの間で登録を共有することもできます。

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

于 2012-07-16T13:22:12.307 に答える
14

私は、mvc5 と web api 2 でこれに苦労している人々を少し助けたいと思いました。

最初にナゲットパッケージを追加します

  • オートファク
  • 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 回登録することになります。

于 2014-06-10T12:45:48.657 に答える
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);
于 2012-07-15T07:02:24.357 に答える