2016-10-28 3 views

답변

5

할 수 없으며 그렇게해서는 안됩니다. 이것은 의존성 주입 시스템을 갖는 전체 목적을 능가합니다. 정적 클래스 (런타임 데이터 또는 서비스 로케이터)는 안티 패턴입니다.

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; 
    } 
} 

SomeClassInClassLibraryScoped 또는 중 하나를 함께 해결해야한다는주의 Transient 모드이고 HttpContext은 요청 기간 동안 만 유효하기 때문에 Singleton 일 수 없습니다.

SomeClassInClassLibrary이 싱글 톤이어야하는 경우에는 팩토리를 삽입하고 요청시 (즉, 작업 내부) IRequestInformation을 해결해야합니다.

마지막으로 중요한 것은 IHttpContextAccessor이 기본적으로 등록되지 않은 것입니다.

IHttpContextAccessor는 현재 스레드의 HttpContext에 액세스하는 데 사용할 수 있습니다. 그러나이 상태를 유지하는 것은 성능상의 비용이 적기 때문에 기본 서비스 집합에서 제거되었습니다. 에 의존

개발자는 필요에 따라 다시 추가 할 수 있습니다 : services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

출처 : HttpContext를가 ASP.NET 코어보다는 .NET 코어의 일부임을 The IHttpContextAccessor service is not registered by default