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

Autofac注册疑问:单例服务依赖InstancePerDependency组件的生命周期影响

问题解答

1. 当前代码中ClassB单例对IClassA生命周期的影响

会影响。因为你将ClassB注册为SingleInstance()(单例),Autofac只会在第一次解析IClassB时创建一次ClassB实例,同时在创建过程中调用c.Resolve<IClassA>()获取一个IClassA实例并注入到ClassB中。这个IClassA实例会和单例ClassB绑定在一起,后续所有使用ClassB的场景都会复用同一个IClassA实例,完全不符合InstancePerDependency(每次解析都生成新实例)的预期。

2. 实现单例IClassB同时保证IClassA的InstancePerDependency生命周期

要解决这个问题,需要让ClassB通过工厂委托来获取IClassA实例,而非直接注入IClassA本身。Autofac会自动注册Func<T>类型的委托,用于延迟解析依赖:

步骤1:修改ClassB的构造函数

让ClassB依赖Func<IClassA>,替换直接依赖IClassA的写法:

public class ClassB : IClassB
{
    private readonly Func<IClassA> _classAFactory;

    public ClassB(Func<IClassA> classAFactory)
    {
        _classAFactory = classAFactory;
    }

    // 当需要使用IClassA时,调用工厂委托获取新实例
    public void DoBusinessLogic()
    {
        var classA = _classAFactory();
        // 执行基于classA的操作
    }
}

步骤2:调整Autofac注册代码

IClassA的注册保持不变,IClassB的注册可以简化(Autofac会自动识别并注入构造函数中的Func<IClassA>):

// IClassA保持原注册,确保每次解析都生成新实例
builder.RegisterType<ClassA>().As<IClassA>().InstancePerDependency();

// ClassB注册为单例,Autofac自动注入Func<IClassA>
builder.RegisterType<ClassB>().As<IClassB>().SingleInstance();

这样,每次ClassB调用_classAFactory()时,Autofac都会解析出一个全新的IClassA实例,既保证了ClassB的单例特性,又让IClassA严格遵循InstancePerDependency的生命周期。


内容的提问来源于stack exchange,提问作者Yoav M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 22:45:02