C# AddSingleton<&燃气轮机;()vs AddSingleton()

C# AddSingleton<&燃气轮机;()vs AddSingleton(),c#,asp.net-core,.net-core,dependency-injection,C#,Asp.net Core,.net Core,Dependency Injection,我正在我的项目中实现依赖注入。我遇到了两种添加单例服务的方法- services.AddSingleton(新的MyCustomService()) 及 services.AddSingleton() 这两种方法似乎都有效。这两种方法之间有什么区别,我应该使用哪种方法?根据第一个示例,您使用的是AddSingleton(IServiceCollection,TService)扩展方法,而在第二个示例中使用的是AddSingleton(IServiceCollection) 这两者之间的区别是

我正在我的项目中实现依赖注入。我遇到了两种添加单例服务的方法-

services.AddSingleton(新的MyCustomService())

services.AddSingleton()
这两种方法似乎都有效。这两种方法之间有什么区别,我应该使用哪种方法?

根据第一个示例,您使用的是
AddSingleton(IServiceCollection,TService)
扩展方法,而在第二个示例中使用的是
AddSingleton(IServiceCollection)

这两者之间的区别是创建
t服务
实例的时间。在第一个示例中,您在注册时创建它。在第二个示例中,它将在第一个请求时创建为容器


你该用哪一种取决于你自己。但是如果您的
MyCustomService
可能有其他依赖项,我想
AddSingleton(IServiceCollection)
可能更方便。

简短回答:显式加载服务与使用泛型通过配置从注入中提取服务相比

在第一个实例中,您正在添加一个正在实例化自己的SingletonService。在第二个示例中,您要求依赖项注入根据配置加载MyCustomService。对于应用程序的不同配置,可能有不同版本的MyCustomService时,后者非常有用


另一种看待它的方式。第一个是加载一个单例,如果没有加载,则加载失败。第二种方法是使用泛型来验证服务类型,如果配置中没有指定服务类型,则会爆炸。

当使用泛型
.AddSingleton()
方法(和
.AddSingleton()时)
,类型由容器创建、控制和处理。当构造函数包含其他依赖项时,这些依赖项将自动注入(一种称为“自动连接”的技术)

使用
.AddSingleton(TService)
提供的实例已经存在。在这种情况下,容器在实现
IDisposable
IAsyncDisposable
时将不处置该实例。您自己负责处置该实例

由于
.AddSingleton(TService)
随已存在的实例一起提供,因此容器不能注入任何依赖项,因为为了做到这一点,它还必须创建实例