답변

11

생활 양식 및 범위를 구현 SimpleInjector 2.5 WebRequestWebApiRequest와는 다른 기술에 기초한다.

WebApiRequestLifestyle은 IIS 내부와 외부 모두에서 잘 작동하는 ExecutionContextScopeLifestyle에서 파생됩니다. 나는. HttpContext.Current이없는 자체 호스팅 WebAPI 프로젝트에서 작동 할 수 있습니다. WebApiRequestLifestyle에서 사용하는 범위는 ExecutionContextScope입니다. 이름에서 알 수 있듯이 ExecutionContextScope은 논리적 호출 컨텍스트에 자신을 등록하고 스레드간에 async 작업으로 이동합니다 (예 : awaitConfigureAwait()true 또는 false과 함께 사용되었는지 여부에 관계없이 다른 스레드의 범위에 계속 액세스 함).

대조적으로 WebRequestLifestyle의 인스턴스는 HttpContext 내에 저장됩니다. HttpContext은 IIS에서 호스팅 될 때 WebAPI와 함께 사용할 수 있지만 현재 HttpContextIllogicalCallContext (Understanding SynchronizationContext in ASP.NET 참조)에 저장되어 있기 때문에 항상 실행 컨텍스트와 함께 흐르지 않으므로주의해야합니다. awaitConfigureAwait(false)과 함께 사용하면 async-op가 동 기적으로 실행되지 않을 때마다 연속으로 원래 HttpContext의 흔적을 잃을 수 있습니다. 이것의 직접적인 영향은 컨테이너 (예 : 컨테이너에 액세스 할 수있는 팩토리)에서 WebRequestLifestyle으로 이전에 생성 된 서비스의 인스턴스를 더 이상 확인할 수 없으며 HttpContext.Current이 될 수 있으므로 예외가 발생합니다. null.

WebAPI 컨트롤러에 주입되는 서비스 인 '웹 API 요청 별'서비스에 WebApiRequestLifestyle을 사용하는 것이 좋습니다. WebApiRequestLifestyle는 다음과 같은 이점을 제공합니다 :

  • WebAPI 컨트롤러 (자체 호스팅 프로젝트의 예) IIS의 외부에서 사용할 수있는 WebAPI 컨트롤러가 실행할 수있는
  • 자유 스레드 (또는 멀티 스레드을) async 메서드는 ASP.net SynchronizationContext에 국한되지 않기 때문에 사용할 수 있습니다.

difference between ExecutionContext and SynchronizationContext에 관한 Stephen Toub의 블로그 항목을 확인하십시오.

+5

+1. 나는 더 나은 자신을 설명 할 수는 없었을 것입니다. 아마 당신의 대답을 Simple Injector Wiki에 직접 복사 할 것입니다. – Steven

+0

고마워,이게 내가 원하는거야. – Tris

+1

MVC 컨트롤러와 WebAPI 컨트롤러에 모두 주입되는 서비스는 무엇입니까? 현재 PerWebRequest를 사용하는 모든 서비스에 대해 PerWebApiRequest를 사용하는 것이 안전합니까? – sheamus

관련 문제