2016-12-06 6 views
0

以前のASP.NETアプリケーションでは、Webページに必要なデータである「コンテキスト」の概念がありました。したがって、コンテキストにはサイト自体に関するデータが含まれ、最終使用の詳細、例えばなど,などを含めることができます。ASP.NET Coreアプリケーションのコンテキストを設定する方法

完全なコンテキストは、要求のライフサイクルの開始時にHttpModuleによってロードされました。 Contextの各部分は、CacheまたはCurrent Items Collectionのいずれかに保持されていました。このページは、必要に応じてコンテキストを呼び出すことができます。

.NETコアで同様のことを達成するにはどうすればよいのでしょうか。

我々はエンドユーザーのデータの簡単な例を取る場合は....

私の考えは、このデータは、「エンドユーザー」と呼ばれるオブジェクトで開催されるということでした。コントローラのコンストラクタタイプIEndUserの引数を持つことができ、私たちはStartup.csに、このインスタンスを追加するには、依存性注入に建て使用することもできます。もちろん

services.AddScoped<IEndUser, EndUser>(); 

これはバニラエンドユーザーオブジェクトが追加されますが、私が望んを私が "AddScoped"を使用しているので、最初にすべてのプロパティを設定するためにMiddleWareクラスを使用することができました。そして、私の希望は、コントローラのコンストラクタがMiddleWareが投入したのと同じインスタンスを受け取ることでした。しかし、私はまもなく、これらが異なるオブジェクト(明らかに後天的な見解)であり、これが間違ったアプローチであることを認識しました。

だから正しいアプローチは何ですか?次の点に注意してクマ:

  • 古いHttpModuleをすると、人は(エンドユーザーオブジェクトへの考え方に似)サイトオブジェクト(DBからデータをロードする)をロードし、site.OnMaintenance財産場合HttpModuleを内部にチェックすることができこの場合、現在の要求に関係なく、実行が要求されたコントローラに入る前に、適切なページへのリダイレクトを実行します。

だから私が好きな、要約する:

  1. 私のミドルウェアクラスを作成し、
  2. 私のミドルウェアは、そのクラスのプロパティでテストを実行するために(データベースから)そのプロパティを設定するために潜在的にリダイレクトを実行します。
  3. リダイレクトがない場合、そのインスタンスをコントローラのコンストラクタに挿入します。

答えて

1

気づいたように、ASP.NETコアのアーキテクチャは異なります。コンテキストオブジェクト(「神オブジェクト」に近づく)のステータスはASP.NETでは一般的でしたが、ASP.NETコアでは適切なアプローチではありません。

アプリケーションが構成されているかについて多くを知らなければ、私は次のことをお勧めしたい:

  1. DIコンテナに追加されMaintenanceNoticeServiceを作成します。このサービスは、OnMaintenanceフラグのデータベースをチェックするために必要なすべてのロジックをカプセル化します。

  2. サービスを使用してサイトの状態を確認するパイプラインでMVCより上にある単純なミドルウェアを作成します。必要に応じて、ここでリダイレクトすることができます。

  3. 作成別途ユーザーデータへのアクセスなどのサービス。これらは、必要に応じてコントローラに注入することができます。

目標は、物事を小さな論理部分に分割することです。サイトのメンテナンスのチェックとコントローラへの注入の両方を処理してユーザデータを提供するContextオブジェクトを持つことは、混乱の懸念です。

関連する問題