3

ASP.Netコアを使用していますが、ビジネスロジッククラス(コントローラまたはアクションではありません)の特定のHTTPヘッダーにアクセスする必要があります。ASP.NetコアビジネスロジックのHTTPヘッダーへのアクセス

ここで設定の全体像を提供するために、カスタムHTTPヘッダーに値を追加するカスタムASP.Netコアミドルウェアがあります。これは、アクセスする必要があるこのヘッダーの値ですビジネスロジッククラスで使用します。

現在、私がこれを達成する方法は、次のDI登録を使用してHttpContextAccessorを注入することです。私は、コンストラクタ注入を使用してIHttpContextAccessorを要求し、関連するHTTPヘッダーにアクセスするためにこれを使用するHTTPヘッダーへのアクセスを必要とするクラスで

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 

上記の作業をうまくやっていて、私が必要とする結果が得られますが、インターネット上のさまざまな記事を見ていますが、ASP.Net CoreでHttpContext.Currentを使用しないように一般的なコンセンサスがあります。

上記の場合、ビジネスロジッククラスがカスタムミドルウェアがカスタムHTTPヘッダーに挿入する値にアクセスするためのより良い方法がありますか?

ミドルウェアはビジネスロジッククラスで使用するために必要な値をHTTPヘッダーに格納していますが、ビジネスロジッククラスで必要な値を使用できるようにミドルウェアの他のメソッドを公開しています。より良いアプローチがあれば。

ご質問やご不明な点がございましたら、お知らせください。

+0

一部の実装では、値を取得するためにコンテキストにアクセスする必要があります。しかし、それはビジネス層であってはなりません。必要なヘッダー値を提供するサービスを作成します。そのクラスはコンテキストを取ります。クラス抽象化はビジネスクラスの依存関係になります – Nkosi

+0

実際には、現時点でコンテキストを取り込んでいるサービスクラスです。おそらくここではもっと具体的だったはずですが、ビジネスロジッククラスを参照することによって、私は実際にコントローラやアクションではないことを明確にしようとしていました。だから一般的に、HTTPコンテキストにアクセスするサービスを回すことは、あなたが推奨しているようです? –

答えて

0

ASP.Net CoreにはHttpContext.Currentがありませんので、使用しないでください。必要に応じて独自の拡張メソッドを実装する必要がありますが、.Net Coreコミュニティの一般的な感じは、IHttpContextAccessorを使用する方がはるかに優れているということです。

.Net Coreの以前のバージョンでは、IHttpContextAccessorの実装がDIコンテナに自動登録されました。より多くの現在のバージョンでは、あなたが言及したコードの行でそれを自分で登録する必要があります:ヘッダへのアクセスを必要とするあなたの方法にIHttpContextを注入

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 

は、実行可能なアプローチです。あるいは、あなたがもっと簡単な構造体にヘッダのコピーを置き、そのオブジェクトをクラスに渡すヘルパーメソッドを使うことができます。それは実際にはフルHttpContextにアクセスする必要がないからです。

+0

ASP.Netプログラミングモデルをあまり調整しないと実現可能かどうか疑問に思う:フィルターやミドルウェアを使用してヘッダーからオブジェクトを作成し、コントローラーに挿入する –

+0

私はそれがとてもうまくいくと思います。たとえば、AppHeadersオブジェクトを返すDIコンテナにAppHeadersAccessorオブジェクトを登録することができます。AppHeadersAccessorオブジェクトは、コンストラクタインジェクションを介してHttpContextAccessorオブジェクトを受け取ることができるため、ミドルウェアやアクションフィルタは必要ありません(私の回答で言及したとおりに登録していれば)。あなたが望むヘッダ情報。 –

関連する問題