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

