Microsoft.Extensions.DependencyInjection的Singleton依赖注入关系,只是对于同一个ServiceProvider是单例的
在Microsoft.Extensions.DependencyInjection中,Singleton代表单例依赖注入,但是这个单例也只是对于相同的ServiceProvider对象而言。
假设我们的项目中有接口IPeople和实现类People,它们之间的依赖注入关系是Singleton的。
新建一个.NET Core控制台项目,代码如下所示:
using Microsoft.Extensions.DependencyInjection; using System; namespace NetCoreDISingletonDemos { interface IPeople { } class People : IPeople { } class Program { static void Main(string[] args) { IServiceCollection services = new ServiceCollection(); services.AddSingleton<IPeople, People>();//注册接口IPeople和类People的关系为Singleton IPeople peopleA = null; IPeople peopleB = null; ServiceProvider serviceProvider = null; //下面测试在同一个ServiceProvider中获取IPeople对象两次,赋值给peopleA和peopleB变量 using (serviceProvider = services.BuildServiceProvider()) { peopleA = serviceProvider.GetService<IPeople>(); peopleB = serviceProvider.GetService<IPeople>(); Console.WriteLine("peopleA==peopleB?{0}", (peopleA == peopleB).ToString());//True } peopleA = null; peopleB = null; //下面测试在不同的ServiceProvider中获取IPeople对象两次,赋值给peopleA和peopleB变量 ServiceProvider serviceProviderA = null; ServiceProvider serviceProviderB = null; using (serviceProviderA = services.BuildServiceProvider()) { peopleA = serviceProviderA.GetService<IPeople>(); } using (serviceProviderB = services.BuildServiceProvider()) { peopleB = serviceProviderB.GetService<IPeople>(); } Console.WriteLine("serviceProviderA==serviceProviderB?{0}", (serviceProviderA == serviceProviderB).ToString());//False Console.WriteLine("peopleA==peopleB?{0}", (peopleA == peopleB).ToString());//False peopleA = null; peopleB = null; //下面测试用同一个ServiceProvider创建的不同IServiceScope,来获取IPeople对象两次,赋值给peopleA和peopleB变量 using (serviceProvider = services.BuildServiceProvider()) { IServiceScope serviceScopeA = null; IServiceScope serviceScopeB = null; using (serviceScopeA = serviceProvider.CreateScope()) { peopleA = serviceScopeA.ServiceProvider.GetService<IPeople>(); } using (serviceScopeB = serviceProvider.CreateScope()) { peopleB = serviceScopeB.ServiceProvider.GetService<IPeople>(); } Console.WriteLine("serviceScopeA.ServiceProvider==serviceScopeB.ServiceProvider?{0}", (serviceScopeA.ServiceProvider == serviceScopeB.ServiceProvider).ToString());//False Console.WriteLine("peopleA==peopleB?{0}", (peopleA == peopleB).ToString());//True } Console.WriteLine("Press any key to end..."); Console.ReadKey(); } } }
执行结果如下所示:
可以看到:
- 我们使用同一个ServiceProvider获取到的两个IPeople对象是相同的。
- 我们使用不同的ServiceProvider获取到的两个IPeople对象是不同的。
- 我们使用同一个ServiceProvider创建的不同IServiceScope,获取到的两个IPeople对象是相同的。
关于Microsoft.Extensions.DependencyInjection的Singleton依赖注入关系,可以参考这里。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2018-10-21 ASP.NET Core 如何设置发布环境
2018-10-21 C# 中的#if、#elif、#else、#endif等条件编译符号 (转载)
2018-10-21 C#中如果用await关键字来await一个为null的Task对象会抛出异常