심층 분석 - ASP.NET Core 종속성 주입의 Autofac 통합

4967 단어 dotnetautofac
일관성이 있어 보이는 한 가지는 Autofac과 ASP.NET의 통합이 계속 변경된다는 것입니다. ASP.NET Core 3.0부터는 일반 호스트가 도입되었기 때문에 변경되었습니다.

ASP.NET에서 Autofac의 사용법을 빠르게 탐색한 다음 핵심에 대한 세부 정보를 살펴보겠습니다. ASP.NET Dependency Injection의 구현과 함께 이것은 분명하지는 않지만 흥미로운 디자인입니다.

설치 및 사용



설치는 간단합니다. ASP.NET 응용 프로그램의 참조Autofac.Extensions.DependencyInjection.

애플리케이션에서 Autofac을 사용하려면 Host 를 생성하는 클래스로 이동합니다. 일반적으로 이것은 Program.cs 및 insert .UseServiceProviderFactory(new AutofacServiceProviderFactory()) 입니다.

다음과 같이 보일 수 있습니다.

public class Program
  {
    public static void Main(string[] args)
    {
      var host = Host.CreateDefaultBuilder(args)
        .UseServiceProviderFactory(new AutofacServiceProviderFactory())
        .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>())
        .Build();

      host.Run();
    }
  }


이렇게 하면 ASP.NET Core 애플리케이션에서 Autofac을 DI 컨테이너로 사용할 수 있습니다.

그런 다음 ConfigureContainer 메서드를 Startup 클래스에 추가하고 Autofac 사용자로 익숙한 ContainerBuilder를 사용하여 컨테이너를 구성할 수 있습니다.

public void ConfigureContainer(ContainerBuilder builder){
    builder.RegisterAssemblyModules(typeof(Startup).Assembly);
}



통합은 또한 IServiceCollection의 등록에 대한 종속성을 지원합니다. 따라서 ASP.NET 종속성 주입 등록만 지원하는 라이브러리가 있는 경우 걱정할 필요가 없습니다. 응용 프로그램에서 사용할 수 있습니다.

이러한 메서드는 환경 기반 명명 규칙도 지원합니다. 나는 그들의 팬이 아니지만 Autofac docs 에서 규칙을 찾을 수 있습니다.

무엇이 등록되어 있습니까?



통합의 핵심은 AutofacServiceProviderFactory 입니다.

ServiceProviderFactory는 ASP.NET 종속성 주입 내의 추상화입니다. 종속성 주입 프레임워크를 ASP.NET과 함께 사용할 수 있도록 하여 종속성에 대한 통합 구성을 갖는 이점(프레임워크에 유용하므로 한 가지 구성 스타일만 지원하면 됨)과 기존 DI 컨테이너의 성능을 결합합니다. .

그래서 두 가지 목적이 있습니다.

첫 번째: DI 컨테이너 빌더를 만들고 이를 ASP.NET ServiceCollection의 종속성으로 채웁니다. 그런 다음 개발자는 추가 종속성을 구성하거나 Autofac 메커니즘을 사용하여 등록된 종속성을 교체할 수 있습니다.

두 번째: 컨테이너를 빌드하고 프레임워크에서 사용할 ServiceProvider로 래핑합니다.

범위 추가



DI 컨테이너와 ASP.NET을 사용하면 개체와 해당 종속성에 대해 서로 다른 범위가 있음을 알 수 있습니다.

기본 사례는 Singleton 및 PerDependency입니다. 여기서 Singleton은 응용 프로그램당 개체에 있고 PerDependency는 개체를 필요로 하는 모든 종속성에 대해 개체를 만듭니다.

HTTP 프레임워크에서 일부 상태 애플리케이션 전체를 공유하고 싶지만 일부 종속성은 요청당 한 번이어야 합니다.

예는 ORM의 UnitOfWork입니다. 종속성이 요청에 대해 요구하면 전체 요청에 대해 동일하게 유지되어야 합니다UnitOfWork.

따라서 LifetimeScope(Autofac 용어) 또는 ServiceScope(ASP.NET 용어)가 존재합니다.

새로운 요청이 시작될 때 생성되고 요청이 완료되면 삭제됩니다.

ASP.NET은 이러한 ServiceScope s를 생성하기 위해 팩토리가 필요합니다. ContainerBuilder Autofac을 채울 때 ASP.NET에서 해결할 수 있도록 이 팩토리( AutofacServiceScopeFactory )를 자체에 추가합니다.

이것이 ASP.NET에 통합되는 방식도 흥미롭습니다. 요청의 HttpContext가 생성되면 ServiceScopeFactory 에 대한 참조를 얻습니다.

서비스가 요청에서 처음 확인되면 ServiceScope 를 인스턴스화하여 이 범위에 대해 구성된 모든 종속성을 해결합니다.

결론



Autofac 통합은 ASP.NET Core용 DI 컨테이너 구현에서 예상대로 구현됩니다.

가장 흥미로운 점은 컨테이너가 ASP.NET에서 해결하기 위해 자체 구현을 등록하는 방법입니다.

몇 달 전에 이것을 디버깅할 때 이 세부 사항을 놓쳤으므로 내 오류가 DI 통합에 있는 것으로 의심됩니다. 분명히 내가 잘못했어...

좋은 웹페이지 즐겨찾기