2009-11-19 39 views
50

コントローラーのコンストラクターが各Webリクエスト中に呼び出されないことは、私の理解です。これが正しいと仮定すると、コントローラのライフサイクルはどのくらいですか? Isは、アプリケーションの開始時に "構築"され、キャッシュされ、各Webリクエストでrequestcontextが注入されて呼び出されますか?ASP.NET MVCコントローラのライフサイクル

コンストラクタの動作をエミュレートする方法を尋ねるのではなく、OnActionExecutingイベントを使用して、通常コンストラクタで行うことを開始します。また、私はユニットとシステムのテストのためのコントローラでコンストラクタを使用します。

ありがとうございます!

答えて

74

default controller factoryを使用する場合は、リクエストごとに新しいインスタンスが作成され、そのようにする必要があります。コントローラは、異なる要求間で共有すべきではありません。コントローラの寿命を管理するカスタムファクトリを書くこともできます。

+10

なぜですか。どうして? –

+2

私は台無しにして、なぜこれが当てはまるのか、なぜそうすべきなのか、自分自身に教えました。私はEFを使って読み書きアクションとビューを持つコントローラを作成していました。生成されたコードは、EFコンテキストインスタンスのプライベートインスタンス変数を作成しました。私は賢くて静的変数にすると思った。問題は、このコントローラーの範囲外にあるものがデータベースを変更した場合、静的コンテキストは決して知りません。これをインスタンス変数として残しておき、各リクエストで新しいインスタンスが作成されるので、コンテキストはデータベースの変更を見ることができます。 – ThatAintWorking

+1

すべての状態がパラメータ(つまり機能的スタイル)内に含まれるWeb APIでは、なぜコントローラを再利用できないのかはわかりません。設計上、スレッドセーフです。 –

10

私は恐れますが、あなたの理解は間違っています。コントローラー(非常に薄くて軽量なクラスでなければならず、セッションの存続状態を持たない)は、実際には各Web要求ごとにオンザフライで構築されます。どのようにコントローラインスタンスが特定のビューに特有のものである可能性がありますか?

ので(リクエスト以外の)「ライフサイクル」のようなものがありません...

1

は、コントローラは、あなたが行うすべての要求のために作成されます。例を挙げてみましょう。

public class ExampleController : Controller{ 
      public static userName; 

      public void Action1(){//do stuff} 
      public void Action2(){//do stuff} 
      public void AssignUserName(string username){ 
       userName = username; 

      } 
      public string GetName(){ return userName;} 


    } 

これで、ユーザ名を渡すビューからコントローラを呼び出すことができます。次回のリクエストで設定したuserNameを取得しないでください。 nullを返します。したがって、要求ごとに新しいコントローラが作成されます。クラスからオブジェクトをインスタンス化するようなMVCのどこにでもコントローラをインスタンス化しません。他のオブジェクトと同じように、単にコントローラオブジェクトメモリポインタを呼び出す必要はありません。

このリンクをクリックしてください。 MVCコントローラのライフサイクルについての説明があります。

ASP.Net MVC - Request Life Cycle

関連する問題