我想在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