我想在一个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();
}
- 我如何告诉AutoFac使用我的请求作用域作为获取依赖项的起点,以便我注册为InstancePerLifetimeScope的实现将使用我的请求作用域解析?
- 如果这不可能,我能否让AutoFac从我的会话范围创建其每个请求的生命周期范围?
- 或者我走错了路?是否有其他方法使AutoFac意识到这种层次结构?
任何帮助或其他评论都将不胜感激。
回应Steven的问题:
我还处于原型设计的早期阶段,但是在sessionScope中可能存在以下内容:
- 用户首选项
- 身份验证和授权上下文(例如用户身份和角色)
与我要构建的应用程序无关,但在电子商务环境中,购物车可以是sessionScope。这可能是最好的具体示例。它是您希望比请求更长但比应用程序更短的东西。
可能会有更多,但是如果我有一个UserPreferences、Authentication和Authorization的策略,那么该策略也可以应用于稍后创建的其他组件。
一种可能的替代方案是在请求开始时获取所有必要信息,并将这些配置的组件放置在请求范围内。这将给我带来我期望的结果,但它不符合我心中关于应用程序-会话-请求层次结构的模型。我希望创建一个有意义的系统,因为我肯定不是维护它的人。