我想在 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 使用我的 requestScope 作为获取依赖项的起点,以便我注册为 InstancePerLifetimeScope 的实现将使用我的 requestScope 解决?
如果这是不可能的,我可以让 AutoFac 在我的 sessionScope 之外创建其每个请求的生命周期范围吗?
还是我在这里走错了路?是否有其他方法可以让 AutoFac 了解这种层次结构?
任何帮助或其他意见表示赞赏。
作为对史蒂文的回应。
我仍处于原型设计的早期阶段,但您在 sessionScope 中可能拥有的东西:
- 用户偏好
- 身份验证和授权上下文(例如用户身份和角色)
与我要构建的应用程序无关,但在电子商务环境中,购物车可以是会话范围的。这可能是最好的具体例子。您希望它比请求寿命更长,但比应用程序更短。
可能不止这些,但如果我有一个用户偏好、身份验证和授权策略,那么该策略也可以应用于稍后将创建的其他组件。
一种可能的替代方法是在请求开始时获取所有必要的信息,并将这些配置的组件放在请求范围内。它会给我我期望的结果,但它与我脑海中关于应用程序->会话->请求层次结构的模型不匹配。我希望创建一个有意义的系统,因为我绝对不是要维护它的人。