Autofac委托工厂:强制生成新实例(即使类型为InstancePerRequest)
让Autofac委托工厂生成独立新实例的解决方案
你遇到的问题其实是Autofac委托工厂的默认行为导致的:当你注册IUnitOfWork为InstancePerRequest时,委托工厂会遵循这个生命周期规则,在同一个HTTP请求内重复调用工厂都会返回同一个实例。要让工厂每次都生成全新的独立实例,这里有两种最实用的方法:
方法一:使用Owned<T>包装返回类型
这是Autofac官方推荐的方式,用于获取不受现有生命周期约束的新实例。
步骤:
- 修改你的委托定义,将返回类型改为
Owned<IUnitOfWork>:
public delegate Owned<IUnitOfWork> UnitOfWorkFactory();
- 在使用工厂时,通过
using语句管理实例的生命周期(确保用完后释放资源):
// 注入工厂后调用 using (var ownedUnitOfWork = _unitOfWorkFactory()) { var independentUow = ownedUnitOfWork.Value; // 在这里使用independentUow执行独立事务 }
原理:Owned<T>会创建一个嵌套的生命周期范围,每次调用工厂都会触发Autofac在这个新范围内解析IUnitOfWork,完全绕过原有的InstancePerRequest约束,保证每次都是全新实例。
方法二:手动注册工厂委托并指定独立生命周期
如果你不想修改委托的返回类型,可以手动注册工厂逻辑,强制每次解析新实例:
builder.Register<UnitOfWorkFactory>(componentContext => { var rootContext = componentContext.Resolve<IComponentContext>(); return () => { // 创建一个临时生命周期范围,解析新实例 using var scope = rootContext.Resolve<ILifetimeScope>().BeginLifetimeScope(); return scope.Resolve<IUnitOfWork>(); }; });
注意:这种方法需要你自己管理临时生命周期范围的释放,或者确保实例使用完后被正确回收。相比Owned<T>,它的代码更繁琐,但适合不能修改委托定义的场景。
为什么默认行为是复用实例?
Autofac的委托工厂会自动继承组件注册时的生命周期策略。你的IUnitOfWork注册为InstancePerRequest,所以同一个请求内所有解析(包括工厂调用)都会复用同一个实例。上面两种方法都是通过创建新的生命周期范围,打破了这个复用规则,从而生成独立实例。
内容的提问来源于stack exchange,提问作者Gianluigi Liguori
相关产品推荐
相关产品推荐

