Autofac 不支持自定义生活方式管理器。
Autofac 生命周期围绕作用域展开,作用域是可嵌套的,并且可以选择使用已知 ID 进行标记。这就是每个 HTTP 请求实例的工作方式:当 Web 请求进入时,会创建一个带有已知值(“AutofacWebRequest”)的嵌套范围“标记”。层次结构如下所示:
- 容器(根生命周期范围)
- Web 请求范围(标记为“AutofacWebRequest”)
使用InstancePerHttpRequest
时基本与InstancePerMatchingLifetimeScope("AutofacWebRequest")
. 如果您解析类型,它会回退,直到找到具有该名称的范围,然后在该标记范围中使用相同的实例。
在标准 WCF 托管中,Autofac 解析所有您可以从实例上下文 ( AutofacInstanceContext.Current.OperationLifetime
) 获取的子范围之外的内容。您可以从中创建一个子生命周期范围并手动标记它,然后像这样解决您的依赖项:
var opScope = AutofacInstanceContext.Current.OperationLifetime;
using(var requestScope = opScope.BeginLifetimeScope("AutofacWebRequest"))
{
// Resolve InstancePerHttpRequest items from requestScope
}
但是,无法自动执行此操作,并且 WCF 托管机制目前还没有以您可以“插入”并执行此操作的方式构建 - 如果您需要自动创建 Web 请求范围,则必须自行创建基于 Autofac 源代码的 WCF 托管机制。
另一种选择是拥有两个不同的容器——一个用于 Web 内容,一个用于 WCF 内容——并在每个容器中注册具有不同生命周期的组件。
除此之外......真的没有办法根据 context 来“切换”生命周期。组件声明了一个生命周期,并且必须为该组件注册表使用它。