developer tip

Autofac-InstancePerHttpRequest 대 InstancePerLifetimeScope

copycodes 2020. 12. 11. 08:22
반응형

Autofac-InstancePerHttpRequest 대 InstancePerLifetimeScope


두 범위의 차이점은 무엇입니까?

나는 건물입니다 Module가지고하기 위해 각 계층 (저장소, 서비스, MVC 응용 프로그램)에 (들), 그러나 InstancePerHttpRequest당신은 어셈블리 Autofac.Mvc이 필요합니다.

내 리포지토리 및 서비스 계층에서 어떤 범위를 사용해야합니까?


InstancePerHttpRequestInstancePerApiRequest본질적으로 같은 일을 - 각 개별 웹 요청에 대한 서비스의 단일 인스턴스를 얻을. 내가 사용합니다 InstancePerHttpRequest대답의 나머지하지만이 두 교환 할 수 있음을 유의하십시오.

InstancePerLifetimeScope서비스를 요청하는 모든 수명 범위에 대해 서비스의 새 인스턴스가 생성됨을 의미합니다. 각 웹 요청에는 고유 한 새로운 수명 범위가 있으므로 실제로는이 두 요청이 똑같은 작업을 수행하는 경우가 많습니다.

유일한 실제 차이점은 아래에 등록 된 서비스가 있고 .NET Framework로 등록 된 InstancePerHttpRequest다른 서비스에서 해당 서비스 중 하나를 요청하는 경우에 발생 SingleInstance합니다. 이 시나리오에서 :

  • SingleInstance에서 구성 요소의 삶 루트 범위
  • InstancePerHttpRequestA는 "AutofacWebRequest"라는 범위에서 구성 요소의 삶 의 자녀 루트 범위

Autofac은 하위 범위의 확인을 허용하지 않으므로 기본적으로 SingleInstance서비스는 서비스를 찾을 수 없습니다 InstancePerHttpRequest.

그러나이 시나리오에서 InstancePerLifetimeScope(대신 InstancePerHttpRequest) 사용한 경우 서비스가 제대로 해결됩니다.

이 모든 것을 자세히 설명하는 다운로드 가능한 코드로 상당히 철저한 기사를 작성했습니다 . 여기를 참조하십시오 . 기사에서 인용 :

여기서 일반적인 오해 중 하나는 WebAPI 응용 프로그램에서 InstancePerLifetimeScope를 사용하여 구성 요소를 등록한다는 것은 구성 요소가 웹 요청 범위에 있음을 의미한다는 것입니다. 즉, "수명"은 "웹 요청의 수명"을 의미합니다. 여기에서 볼 수 있듯이 이것은 거짓입니다.

구성 요소의 수명은 해결 된 범위에 따라 결정됩니다.

SingletonResolvable은 루트 범위에서 토큰을 확인하므로 해당 토큰 인스턴스는 웹 요청 범위가 아닌 루트 범위에 있습니다. 이전에 말씀 드렸지만 다시 말씀 드리겠습니다.이 토큰은 전체 애플리케이션이 폐기 될 때까지 유지됩니다 (예 : IIS 작업자 프로세스가 재활용 됨). 루트 범위에서 ScopeToken을 요청하는 모든 것에는 해당 토큰에 대한 참조가 제공됩니다.

도움이 되었기를 바랍니다.이 질문은 이제 꽤 오래되었지만 여전히 관련성이 높습니다.


응용 프로그램에서 개체의 수명에 대한 결정을 완전히 내릴 수있는 유일한 위치는 컴포지션 루트입니다.

이 경우 충돌이 있습니다 (MVC 통합에서 제공하는 확장 메서드에 대한 액세스 권한이 없어야하는 일반 모듈이 있지만 수명을 제대로 관리하려면 액세스 권한이 있어야합니다). 이 경우 모듈이 합리적인 기본값 (예 :)을 제공 할 수 있다면 InstancePerLifetimeScope모듈 수준에서 수행 할 작업입니다. 그런 다음 컴포지션 루트가 해당 동작을 재정의하도록합니다. 이 경우 컴포지션 루트는 수명을 InstancePerHttpRequest. 마지막 등록이 이전 등록보다 우선하므로 상태가 양호해야합니다.

나는 실제로 몇 가지 이유로 주어진 레이어를 포함하는 어셈블리와 공존하는 모듈을 만드는 것에서 멀어졌습니다.

  1. 내 컴포지션 루트를 제외하고는 원하지 않는 Autofac에 대한 종속성을 소개합니다.
  2. 모듈이 수명이 어떻게 관리되어야하는지 알고 있다는 것을 암시합니다. 이는 일반적으로 사실이 아닙니다. 그렇다면 평생 관리를 제공하는 공장 또는 기타 클래스를 제공하지 않는 이유는 무엇입니까?

대신 (그리고 보증 할만큼 큰 프로젝트에서), 저는 컴포지션 루트 레벨에서 모듈을 생성합니다.이 레벨에서는 어떻게 함께 연결되어야하는지에 대한 명확한 지식을 가지고 있습니다. 때로는 Ioc모듈을 포함하고 기본 컴포지션 루트 역할을 하는 어셈블리를 만들 것입니다. 그러나 이것은 종종 "실제"컴포지션 루트 (예 : Ioc어셈블리 를 가져 오는 콘솔 또는 MVC 응용 프로그램)에서 재정의됩니다 .


Autofac에서 수명 범위는 중첩 된 수명을 사용하여 사용자 지정 범위를 만드는 일반적인 방법입니다.

을 사용 InstancePerLifetimeScope하면 단일 요청에 대한 구성 요소 수명이 추가되고이 구성 요소에 대해 내부적으로 사용되는 요청 당 범위가 제공 InstancePerLifetimeScrope됩니다.

사용 InstancePerLifetimeScope이 필요하거나 참조해야 할 문제가 있으면 어디서나 Autofac.Integration.Mvc서비스 계층에서 어셈블리 - 요청 및 사용의 각 처음에 수동으로 중첩 된 범위를 만듭니다 InstancePerLifetimeScope.

참고 URL : https://stackoverflow.com/questions/12127000/autofac-instanceperhttprequest-vs-instanceperlifetimescope

반응형