내가 가지고있는 정적 헬퍼 클래스.NET 핵심 IHttpContextAccessor 문제
public static class Current
{
public static string Host
{
get { return "httpContextAccessor here"; }
}
}
?
내가 가지고있는 정적 헬퍼 클래스.NET 핵심 IHttpContextAccessor 문제
public static class Current
{
public static string Host
{
get { return "httpContextAccessor here"; }
}
}
?
할 수 없으며 그렇게해서는 안됩니다. 이것은 의존성 주입 시스템을 갖는 전체 목적을 능가합니다. 정적 클래스 (런타임 데이터 또는 서비스 로케이터)는 안티 패턴입니다.
ASP.NET 코어에서는 필요한 곳에서 IHttpContextAccessor
을 삽입해야합니다. 당신은 비 정적 클래스를 만들어의 라인을 따라 뭔가를 할 수 있습니다
public class RequestInformation : IRequestInformation
{
private readonly HttpContext context;
public RequestInformation(IHttpContextAccessor contextAccessor)
{
// Don't forget null checks
this.context = contextAccessor.HttpContext;
}
public string Host
{
get { return this.context./*Do whatever you need here*/; }
}
}
및 클래스 라이브러리에
그것을 주입 :public class SomeClassInClassLibrary
{
private readonly IRequestInformation requestInfo;
public SomeClassInClassLibrary(IRequestInfomation requestInfo)
{
// Don't forget null checks
this.requestInfo = requestInfo;
// access it
var host = requestInfo.Host;
}
}
이 SomeClassInClassLibrary
이 Scoped
또는 중 하나를 함께 해결해야한다는주의 Transient
모드이고 HttpContext
은 요청 기간 동안 만 유효하기 때문에 Singleton
일 수 없습니다.
SomeClassInClassLibrary
이 싱글 톤이어야하는 경우에는 팩토리를 삽입하고 요청시 (즉, 작업 내부) IRequestInformation
을 해결해야합니다.
마지막으로 중요한 것은 IHttpContextAccessor
이 기본적으로 등록되지 않은 것입니다.
IHttpContextAccessor는 현재 스레드의 HttpContext에 액세스하는 데 사용할 수 있습니다. 그러나이 상태를 유지하는 것은 성능상의 비용이 적기 때문에 기본 서비스 집합에서 제거되었습니다. 에 의존
개발자는 필요에 따라 다시 추가 할 수 있습니다 :
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
출처 : HttpContext를가 ASP.NET 코어보다는 .NET 코어의 일부임을 The IHttpContextAccessor service is not registered by default
참고. –