답변:
가장 간단한 방법은 응용 프로그램을 가져 와서 속성을 ApplicationInstance
사용하는 것입니다 Context
.
// httpContextBase is of type HttpContextBase
HttpContext context = httpContextBase.ApplicationInstance.Context;
( 의견에 이것을 언급 한 Ishmael Smyrnow 에게 감사드립니다 )
특히 처리 한 HttpContextBase
인스턴스가 HttpContextWrapper
런타임 에 유형 인 경우 특히 가능합니다 . 다음 예제는이를 수행하는 방법을 보여줍니다. Foo
컨텍스트를 HttpContextBase
다음 과 같이 받아들이 는 메소드 가 있지만 컨텍스트를 다음 과 같이 입력 해야하는 타사 어셈블리에서 메소드를 호출해야합니다 HttpContext
.
void Foo(HttpContextBase context)
{
var app = (HttpApplication) context.GetService(typeof(HttpApplication));
ThirdParty.Bar.Baz(app.Context);
}
// Somewhere in assembly and namespace ThirdParty,
// in a class called Bar, there is Baz expecting HttpContext:
static void Baz(HttpContext context) { /* ... */ }
HttpContextBase
GetService
지원의 결과로 호출되는 메소드 가 있습니다 IServiceProvider
. 랩핑 된 인스턴스 의 구현에 대한 대리자 의 GetService
재정의 . 의 구현을 통해 , 등의 일반적인 용의자를 쿼리 할 수 있습니다 . Context 라는 속성이 있고 의 인스턴스를 반환하는 경우에도 마찬가지 입니다 . 그래서 하나는 포장에 도착 물어 예를 위해 를 통해 판독 한 다음 반환의 자산 인스턴스를.HttpContextWrapper
GetService
HttpContext
GetService
HttpContext
HttpApplication
HttpRequest
HttpResponse
HttpApplication
HttpContext
HttpContext
HttpContextBase
HttpApplication
GetService
Context
HttpApplication
달리 HttpContextBase
, GetService
의 공용 멤버로 표시되지 않습니다 HttpContext
하지만 때문이다 HttpContext
구현을 IServiceProvider.GetService
명시 적으로있는 동안은 HttpContextBase
하지 않습니다.
마음에 곰 Foo
이 수있는에 의존하기 때문에 더 이상 검증하지 않습니다는 기본 랩을 해제하기 위해 HttpContext
테스트 중에 첫 번째 장소에서 가짜 / 스텁에 거의 불가능하다. 그러나이 답변의 요점은 "HttpContextBase에서 HttpContext 객체를 어떻게 얻습니까?"라는 질문을 말 그대로 해결하는 것 입니다. 설명 된 기술은 수정해야 할 요소가없는 구성 요소 사이에 끼어있는 상황에서 유용합니다.
context.ApplicationInstance.Context
없습니까?
Http*Base
의해 반환 된 모든 변형 중에서 그것을 놓친 방법은 없습니다 HttpContextBase
. : P 답변을 업데이트하겠습니다.
넌 할 수있어
var abstractContext = new System.Web.HttpContextWrapper(System.Web.HttpContext.Current);
당신은 할 수 없습니다.
전체적인 목적은 HttpContextBase
구체적 HttpContext
클래스 에 대한 의존성을 추상화하는 것 입니다. 그 동안 수 콘크리트를 포함 HttpContext
(의 경우와 같은 httpContextWrapper
) 다른 구현과는 절대적으로 아무것도 할 수있다 HttpContext
.
가장 좋은 방법은 HttpContextBase
콘크리트 HttpContext
를 항상로 포장 할 수 있으므로 사용자를위한 맞춤 추상 팩토리를 정의하는 것 HttpContextWrapper
입니다.
IHttpHandler
구현 을 테스트 하려면 단위 테스트를 위해 (응답 래퍼)에 많은 수의 추상화를 넣어야합니다. 이는 옳지 않지만 유일한 옵션입니다.