You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Autofac委托工厂:强制生成新实例(即使类型为InstancePerRequest)

让Autofac委托工厂生成独立新实例的解决方案

你遇到的问题其实是Autofac委托工厂的默认行为导致的:当你注册IUnitOfWork为InstancePerRequest时,委托工厂会遵循这个生命周期规则,在同一个HTTP请求内重复调用工厂都会返回同一个实例。要让工厂每次都生成全新的独立实例,这里有两种最实用的方法:

方法一:使用Owned<T>包装返回类型

这是Autofac官方推荐的方式,用于获取不受现有生命周期约束的新实例。

步骤:

  1. 修改你的委托定义,将返回类型改为Owned<IUnitOfWork>:
public delegate Owned<IUnitOfWork> UnitOfWorkFactory();
  1. 在使用工厂时,通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:27:20