이 똑같은 문제가 발생했지만 방금 다른 해결책이 있습니다.
인터페이스 :
public interface IHttpContextProvider
{
/// <summary>
/// Gets the current HTTP context.
/// </summary>
/// <value>The current HTTP context.</value>
HttpContextBase Current { get; }
}
구현 :
/// <summary>
/// A default HTTP context provider, returning a <see cref="HttpContextWrapper"/> from <see cref="HttpContext.Current"/>.
/// </summary>
public class DefaultHttpContextProvider : IHttpContextProvider
{
public HttpContextBase Current
{
get { return new HttpContextWrapper(HttpContext.Current); }
}
}
그때 용기에 싱글로서 IHttpContextProvider
레지스터. DI에 관해서는 아직 초보자입니다. 아마도 복잡하게 끝났을 지 모르지만, 이해할 수있는 것으로부터, 어떤 Singleton 구성 요소도 PerWebRequest 라이프 스타일 구성 요소에 의존 할 수 없습니다. 그러나 그것은 모든 예들이하는 것입니다.) 내 솔루션에서는, 난 고립 된 구성 요소에 HttpContext.Current
에 의존하고 그 테스트에 관심이 아니에요. 그러나 HTTP 컨텍스트에 액세스해야하는 모든 구성 요소는 IHttpContextProvider
에 따라이를 가져올 수 있으며 필요에 따라 쉽게 조롱 할 수 있습니다.
정말 복잡한 일이 있습니까? 아니면 내 해결책에 대한 경고가 있습니까?
마크, 정보 주셔서 감사합니다 - PerWebRequest에 대해 몰랐습니다. 나는 그것을 조사 할 것이다. –
Mark, PerWebRequest를 살펴 봤지만 서비스가 HttpContext를 얻는 방법을 아직 볼 수 없습니다. HttpContextBase의 인스턴스를 컨테이너에 직접 등록하려고하면 인스턴스가 이전 요청에 이미 등록되어 있으므로 두 번째 요청 후에 실패합니다. 지금까지 Google에서 아무 것도 찾을 수 없었습니다 ... –
내가하려는 일을 오해했을 수도 있지만, Application_Start에서 HttpContext를 사용할 수 없습니다.이 시점에서 * HttpContext가 없습니다 (PerWebRequest 또는 PerWebRequest가 없음).). 이제 생각해 보면,이 수명은 이미 ASP.NET MVC 프레임 워크에서 관리되고 있으므로 DI 컨테이너에서 HttpContext의 수명을 제어하려고 시도하는 것은 의미가 없습니다.당신이 할 수있는 일은 커스텀 IControllerFactory에 연결하여 그 시점에서 제공되는 HttpContext를 잡은 다음 팩토리 메소드를 사용하여 그 밖의 모든 것을 연결하는 것입니다. –