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

Autofac IoC生命周期作用域含义解析及实例疑问

Autofac InstancePerLifetimeScope 作用域解析

你遇到的这个问题其实是对Autofac中“生命周期作用域”的定义理解偏差了——它不是指方法、类这样的代码块范围,而是Autofac中显式创建的LifetimeScope对象层级。

先解释你当前代码的行为:
你直接通过根容器autofacContainer来解析IMyService,而根容器本身就是一个顶级的生命周期作用域。所有从根容器直接Resolve的InstancePerLifetimeScope注册的服务,都会共享同一个实例——不管你在哪个方法里调用,只要是从根容器拿,就都是同一个对象,直到根容器被释放。

那什么才是Autofac里的“生命周期作用域”呢?
它是你通过BeginLifetimeScope()方法显式创建的独立作用域,每个作用域都是一个隔离的容器子上下文。比如修改你的测试代码:

void _test1() {
    using(var scope = autofacContainer.BeginLifetimeScope()) {
        var myService = scope.Resolve<IMyService>();
        // 这里的myService是当前作用域内的单例
    }
}

void _test2() {
    _test1();
    using(var scope = autofacContainer.BeginLifetimeScope()) {
        var myService = scope.Resolve<IMyService>();
        // 这里的myService是另一个作用域的实例,和_test1里的不一样
    }
}

这样修改后,_test1和_test2里的myService就会是不同的实例了——因为它们属于两个完全独立的生命周期作用域。

再补充个常见场景:在Web应用里,Autofac会自动为每个HTTP请求创建一个生命周期作用域,这时候InstancePerLifetimeScope就等价于“每个请求一个实例”,这也是这个注册方式最常用的场景。

总结一下核心点:

  • 根容器是顶级作用域,直接从根容器Resolve的InstancePerLifetimeScope服务是全局单例
  • 只有显式创建的子作用域(BeginLifetimeScope())才会提供独立的实例上下文
  • 作用域的边界是由你创建的LifetimeScope对象决定的,和代码的方法、类结构无关

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:01:30