2016-10-28 6 views
2

私が持っている静的ヘルパークラス.NETのコアIHttpContextAccessorの問題

public static class Current 
{ 
    public static string Host 
    { 
     get { return "httpContextAccessor here"; } 
    } 
} 

+0

ノートのHttpContextは、ASP.NETのコアではなく、.NETのコアの一部であること。 –

答えて

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かのいずれかで解決しなければならないことに注意してくださいHttpContextは要求の期間中のみ有効であるため、Transientモードであり、Singletonにはなりません。

また、SomeClassInClassLibraryをシングルトンにする必要がある場合は、工場出荷時にオンデマンドで(すなわちアクション内で)IRequestInformationを解決する必要があります。

最後に、IHttpContextAccessorは既定では登録されていません。

IHttpContextAccessorを使用して、現在のスレッドのHttpContextにアクセスできます。しかし、この状態を維持することは、パフォーマンス上のコストを削減するので、デフォルトのサービスセットから削除されています。必要に応じてそれを再度追加することができますに依存

開発者: services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

出典:The IHttpContextAccessor service is not registered by default