我想在Web應用程序中使用AutoFac。我有根容器,每個會話有一個子容器,每個請求有一個子容器。我試圖找出管理這些生命週期範圍的最佳方法。在Global.asax.cs中我已經添加了以下內容:在asp.net中管理每個會話和請求的AutoFac生命週期範圍mvc 3
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();
}
我怎麼能告訴AutoFac用我的requestScope爲出發點越來越依賴關係,讓我註冊爲InstancePerLifetimeScope的實現將是使用我的requestScope解決?
如果這是不可能的,我可以讓AutoFac創建它的per-request生存期範圍嗎?
或者我在錯誤的軌道上嗎?有沒有其他的方法讓AutoFac知道這個層次結構?
任何幫助或其他意見表示讚賞。
迴應史蒂文。
我仍然在原型的早期階段,但有可能的事情,你可以有在sessionScope:
- 使用UserPreferences
- 身份驗證和授權範圍內(例如,用戶身份和角色)
與我將要構建的應用程序無關,但在電子商務環境中,購物車可以是會話範圍。這可能是最好的具體例子。這是你期望壽命比請求更長的事情,但比應用程序更短。
可能還有更多,但如果我有UserPreferences,Authentication和Authorization的策略,那麼這個策略也可以應用到稍後創建的其他組件。
可能的替代方法是在請求開始時獲取所有必要的信息,並將這些配置的組件放在請求範圍中。它會給我我期望的結果,但它與我在腦海中關於應用程序 - >會話 - >請求層次結構的模型不匹配。我希望創建一個合理的系統,因爲我絕對不是要維護它的系統。
您希望在每個會話範圍註冊哪些服務?這對於我們在問題3「我在錯誤的軌道上嗎?」給出了一個很好的答案是需要的。 – Steven 2012-07-31 20:16:49