IT TIP

ASP.NET MVC 및 ASP.NET Web Api에서 작동하도록 Autofac을 구성 할 수 있습니까?

itqueen 2020. 12. 15. 20:37
반응형

ASP.NET MVC 및 ASP.NET Web Api에서 작동하도록 Autofac을 구성 할 수 있습니까?


ASP .NET MVC 및 ASP .NET Web Api에서 작동하도록 Autofac을 구성 할 수 있습니까? 종속성 해결 프로그램이 다르다는 것을 알고 있습니다. 그러나 문서화 된 접근 방식을 사용할 때는 하나의 글로벌 리졸버 만 설정할 수 있습니다.

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

이 접근 방식이 나쁜 생각입니까? 솔루션을 두 개의 프로젝트로 분리하고 각각에 대한 종속성 주입을 개별적으로 처리해야합니까?


MVC 및 Web API 모두에서 작동하도록 Autofac을 구성하는 것은 확실히 가능합니다. 이것은 매우 일반적인 시나리오가 될 것으로 예상됩니다. MVC와 Web API는 서로 독립적으로 사용할 수 있으므로 두 개의 개별 종속성 확인자 구현이 있습니다. Autofac 통합에도 동일하게 적용됩니다.

동일한 응용 프로그램에서 MVC와 웹 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수명 범위가 동일한 태그를 공유 하기 때문에 둘간에 등록을 공유 할 수도 있습니다 .

Web API 및 MVC에 대한 종속성 확인자를 설정하는 메커니즘이 다릅니다. 웹 API의 사용 GlobalConfiguration.Configuration.DependencyResolver과 MVC의 사용 DependencyResolver.SetResolver.


나는 mvc5와 웹 API 2에서 이것으로 어려움을 겪는 사람들에게 약간의 도움을 줄 것이라고 생각했습니다.

먼저 너겟 패키지 추가

  • Autofac
  • Autofac asp.net mvc 5 통합
  • Autofac asp.net 웹 API 2.x 통합

global add in 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());
        }
    }
}

From now for each new assembly you add to the project add a new module and then register the module in the AddRegisterations function (example given)

Note:

I returned the container, this isn't necessary.

This scans the current assembly for modules so don't add local modules in AddRegisterations otherwise you will register everything twice.


Definitely separate them. Autofac has both ASP.NET MVC and ASP.NET Web API integrations. This is not always the case but if you need the same services in both application, most probably there is something wrong with the application architecture.

Here is how you might do this with 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();
    }
}

Then, register this inside the Global.asax.cs as below:

AutofacWebAPI.Initialize(GlobalConfiguration.Configuration);

ReferenceURL : https://stackoverflow.com/questions/11484904/is-it-possible-to-configure-autofac-to-work-with-asp-net-mvc-and-asp-net-web-api

반응형