ASP.NET Core中AddSingleton的工厂方法是否保证仅执行一次?
结论
你提到的官方.NET自带依赖注入容器的AddSingleton工厂重载,传入的工厂方法会被保证仅执行一次,即使存在高并发获取服务的场景也不会出现多次执行的情况。
具体说明
- 官方
Microsoft.Extensions.DependencyInjection的单例服务初始化逻辑内部内置了锁机制:当第一个请求触发单例服务创建时,会锁定初始化流程,工厂方法只会在这个流程中执行一次,执行完成后生成的实例会被缓存到容器中,后续所有请求不管是并发还是串行,都会直接拿到缓存的实例,不会再触发工厂调用。 - 上述规则仅针对微软官方默认DI容器实现,如果你的项目替换了Autofac、Castle Windsor等第三方DI容器,需要参考对应容器的官方文档确认实现规则。
你提到的重载方法签名如下:
public static IServiceCollection AddSingleton<TService>( this IServiceCollection services, Func<IServiceProvider, TService> implementationFactory) where TService : class
注意不要和瞬时/作用域服务的工厂重载混淆:
AddTransient的工厂每次获取服务都会执行,AddScoped的工厂每个请求作用域会执行一次,只有AddSingleton的工厂全局仅执行一次。
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

