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
相关产品推荐
相关产品推荐

