ASP.net MVC:アプリケーションデータの保存場所
-
03-07-2019 - |
質問
ASP.net MVCへのアプリケーションの移植を開始したばかりで、アプリケーションの状態を保持するオブジェクトがあります(マシンで実行されている特定のプロセスを追跡し、必要に応じて開始および停止し、MSMQメッセージを送受信します)。
このオブジェクトはどこに保管すればよいですか?現在のアプリケーション(HttpListenerに基づく)ではシングルトンですが、シングルトンではテストが困難になることを知っています。少なくともMVCアプリケーション自体のコンテキストでは、このオブジェクトをモックまたはテストすることは難しく、アプリケーションの外部には独自のテストセットがあります。ただし、テストのためにスタブに置き換える必要がある場合があります。
オブジェクトは、多くのコントローラーで使用可能にする必要があります。このオブジェクトをどこに保存する必要があり、どのようにコントローラーで使用できるようにしますか?私が見たASP.net MVCの例で説明されているようなケースを見たことはありません。
更新:
このデータをデータベースに保存できない理由を説明する必要があると思います。まず、アプリケーションの機能を説明する必要があります。
このアプリケーションは、MSMQを介して通信されるサーバー上で実行されているプロセスである「エンジン」によって動的に生成される画像を提供します。 EngineManagerについて質問しているオブジェクトを呼び出しましょう。プロセスは次のようになります:
- クライアントはXML要求をサーバーにPOSTし、「エンジン」という名前を付けます。使用する画像、および画像を説明する多数のパラメータ。
- アプリケーションはEngineManagerをチェックして、そのエンジンが実行されているかどうかを確認します。そうでない場合は、起動します。
- アプリケーションはMSMQメッセージをエンジンに送信し、応答を待ちます。
- アプリケーションは生成された画像をクライアントに送り返します。
- エンジンがシャットダウンまたはクラッシュした場合、アプリケーションはそのことを認識して、そのエンジンへの次のリクエストで再起動できるようにする必要があります。
- アプリケーションがシャットダウンすると、すべてのエンジンもシャットダウンします。
これらの要求を処理するコントローラーがいくつかあり、それぞれがわずかに異なるジョブを実行します。特定の状況では他のリソースへのアクセスを同期する必要があるため、それらはすべて同じEngineManagerと通信する必要があります。
ご覧のとおり、これは典型的なデータベースバックアップWebサーバーではありません。
解決
このオブジェクトをすべてのユーザーが利用できるようにする場合、つまりセッション固有ではない場合は、アプリケーション状態での保存を確認できます:
http://msdn.microsoft.com/ en-us / library / bf9xhdz4(VS.71).aspx
ただし、上記のリンクページにリストされているように、アプリケーションの状態にはいくつかの不利な点があります。一般に、Applciation状態から明確に進み、アプリケーションデータをバックエンドDBに保存します。このルートに行きたくないので、アプリケーションの状態は問題ないかもしれません。
他のヒント
各 Controller
インスタンスのコンストラクターにオブジェクトを渡す必要があり、コントローラーアクションメソッドはすべて、 Controller
インスタンスコンストラクターに渡されたオブジェクトインスタンスを使用する必要があります。
ASP.NET MVCに同梱されているデフォルトの ControllerFactory
では、これを行うことはできません。ただし、このスタイルのプログラミングを許可する無料のアドオンフレームワークがあります(私が気に入っているのはAutofacです)。
データベースにアプリケーションデータを保持し、モデルレイヤーごとにこれにアクセスします。クライアントはセッションIDのみを保持します。