IServiceScopeFactory的内部注册方式及具体实现是什么
IServiceScopeFactory 的注册机制与实现类
注册逻辑
IServiceScopeFactory是DI容器自带的核心服务,完全不需要手动注册,它会在你调用BuildServiceProvider()生成根容器的过程中被自动加入服务注册表:
- 注册的生命周期是单例,整个根容器的生命周期内只会有一个实例
- 这个注册是容器强制的默认项,就算你手动往
ServiceCollection里加了IServiceScopeFactory的自定义实现,构建容器的时候也会被内置实现覆盖,不会生效 - 把它做成内置服务还有一个好处:可以无缝兼容第三方DI容器,只要第三方容器实现了
IServiceScopeFactory接口,上层的CreateScope()扩展方法不用改任何代码就能正常调用。
具体实现类
在微软官方默认的DI实现(Microsoft.Extensions.DependencyInjection库)里,IServiceScopeFactory的实现就是根容器本身的内部类ServiceProvider——这个类是internal修饰的,不对外暴露具体类型,它直接实现了IServiceScopeFactory接口,对应的CreateScope()方法会生成一个新的ServiceScope实例,绑定独立的子服务提供者:子提供者会复用根容器的所有服务注册配置、单例服务缓存,自己独立维护Scoped服务的生命周期,作用域释放的时候子提供者创建的Scoped服务也会跟着被回收。
你贴的示例代码有3处笔误,可正常运行的修正版本如下:
public class Program { public static void Main(string[] args) { var services = new ServiceCollection(); services.AddScoped<IXXX, XXX>(); ServiceProvider rootContainer = services.BuildServiceProvider(true); using (IServiceScope scope = rootContainer.CreateScope()) { IXXX sth= scope.ServiceProvider.GetRequiredService<IXXX>(); } } }
对应的修正点:
rootContainer.CreateScope漏了方法调用括号,补全为rootContainer.CreateScope()- 该行末尾多余的斜杠
/直接删除 - 注册时配置的是
IXXX到XXX的映射,解析时的规范写法是解析IXXX接口而非具体实现类XXX
内容的提问来源于stack exchange,提问作者user16276760
相关产品推荐
相关产品推荐

