コントローラのコンストラクタでSessionがnullになるのはなぜですか?アクションメソッドからアクセスできます。おそらく、MVCルーティングフレームワークはコントローラーの更新を担当しているため、その時点ではセッションを(再)インスタンス化していません。
これが仕様によるものであるかどうか、そうであればなぜですか?
[遅延読み込みパターンを使用して問題を回避することができました。]
回答:
Andreiは正解です。ASP.NETMVCフレームワークで実行している場合、コントローラークラスが予想どおりに構築されたときにHttpContext(およびHttpContext.Session)が設定されないため、これはnullですが、後で設定(「挿入」)されます。 ControllerBuilderクラスによって。ライフサイクルをよりよく理解したい場合は、ASP.NET MVCフレームワーク(ソースは利用可能です)をプルダウンするか、またはこのページを参照してください。
セッションにアクセスする必要がある場合、「OnActionExecuting」メソッドをオーバーライドしてそこにアクセスする方法があります。その時点で利用可能になるためです。
ただし、Andreiが示唆しているように、コードがセッションに依存している場合は、単体テストを作成するのが難しい可能性があるため、おそらく、セッションをヘルパークラスにラップして、別の非ユニットテストで実行しているときのWebバージョン。したがって、コントローラーをWebから切り離します。
ここでの他の回答に加えて、Controller.Session
はコンストラクタに入力されていませんが、次の方法でセッションにアクセスできます。
System.Web.HttpContext.Current.Session
これにより、コントローラーのテスト性が低下する可能性があるという標準的な警告があります。
セッションはライフサイクルの後半で挿入されます。なぜとにかくコンストラクタでセッションが必要なのですか?TDDで必要な場合は、セッションをモック可能なオブジェクトにラップする必要があります。
この答えは一部の人にとって役立つかもしれません
Initializeメソッドをオーバーライドする場合は、リクエストコンテキストで基本クラスを初期化する必要があります。base.Initialize(requestContext);
protected override void Initialize(RequestContext requestContext)
{
base.Initialize(requestContext);
}
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
。