WebアプリケーションでAutoFacを使用したい。ルートコンテナ、セッションごとの子コンテナ、リクエストごとの子コンテナがあります。私は、これらのライフタイムスコープを管理するための最良の方法を理解しようとしています。Global.asax.csに、以下を追加しました。
protected void Application_Start(object sender, EventArgs e)
{
var container = ...;
}
protected void Session_Start(object sender, EventArgs e)
{
var sessionScope = container.BeginLifetimeScope("session");
Session["Autofac_LifetimeScope"] = sessionScope;
}
protected void Application_BeginRequest(object sender, EventArgs e)
{
var sessionScope = (ILifetimeScope) Session["Autofac_LifetimeScope"];
var requestScope = sessionScope.BeginLifetimeScope("httpRequest");
HttpContext.Current.Items["Autofac_LifetimeScope"] = requestScope;
}
protected void Application_EndRequest(object sender, EventArgs e)
{
var requestScope = (ILifetimeScope)HttpContext.Current.Items["Autofac_LifetimeScope"];
requestScope.Dispose();
}
protected void Session_End(object sender, EventArgs e)
{
var sessionScope = (ILifetimeScope)Session["Autofac_LifetimeScope"];
sessionScope.Dispose();
}
protected void Application_End(object sender, EventArgs e)
{
container.Dispose();
}
依存関係を取得するための開始点としてrequestScopeを使用するようにAutoFacに指示して、InstancePerLifetimeScopeとして登録した実装がrequestScopeを使用して解決されるようにするにはどうすればよいですか?
それが不可能な場合、AutoFacにsessionScopeからリクエストごとのライフタイムスコープを作成させることはできますか?
それとも私はここで間違った方向に進んでいますか?AutoFacにこの階層を認識させる他の方法はありますか?
ヘルプやその他のコメントをいただければ幸いです。
スティーブンに応えて。
私はまだプロトタイピングの初期段階にありますが、sessionScopeで可能なことは次のとおりです。
- UserPreferences
- 認証と承認のコンテキスト(ユーザーIDとロールなど)
作成するアプリケーションとは関係ありませんが、eコマース環境では、ショッピングカートをセッションスコープにすることができます。これはおそらく最良の具体例です。これは、リクエストよりも長持ちしますが、アプリケーションよりも短命であると期待するものです。
これ以上の可能性がありますが、UserPreferences、Authentication、Authorizationの戦略がある場合、その戦略は後で作成される他のコンポーネントにも適用できます。
考えられる代替手段は、要求の開始時に必要なすべての情報を取得し、これらの構成済みコンポーネントを要求スコープに配置することです。期待する結果が得られますが、アプリケーション->セッション->リクエストの階層について考えているモデルとは一致しません。私はそれを維持しようとしている人ではないので、意味のあるシステムを作りたいと思っています。