C# .NETCore2.1中单例注入方法的差异

C# .NETCore2.1中单例注入方法的差异,c#,asp.net-core,.net-core,C#,Asp.net Core,.net Core,这些注射方法有什么区别 services.TryAdd(ServiceDescriptor.Singleton<IMyClass, MyClass>()); services.AddSingleton<IMyClass, MyClass>(); services.TryAdd(servicescriptor.Singleton()); services.AddSingleton(); 无论如何都将注册IMyClass,即使已经有不同的注册,例如。这将导致两次IMyC

这些注射方法有什么区别

services.TryAdd(ServiceDescriptor.Singleton<IMyClass, MyClass>());

services.AddSingleton<IMyClass, MyClass>();
services.TryAdd(servicescriptor.Singleton());
services.AddSingleton();
无论如何都将注册
IMyClass
,即使已经有不同的注册,例如
。这将导致两次
IMyClass
注册

当使用
provider.GetService
/
provider.getRequiredService
或注入
IMyClass
IEnumerable
时,就会出现差异

使用
provider.GetService
/
provider.getRequiredService
或injection
IMyClass
时,将使用最后一次注册(如果错误,请更正我,在quick上找不到参考/GitHub问题)

所以如果你有

 services.AddSingleton<IMyClass, DefaultMyClass>();
 services.AddSingleton<IMyClass, MyClass>();
将返回
DefaultMyClass
,因为
不会被注册

另一方面,当您使用
provider.GetServices(…)
(注意复数版本,末尾有一个s)或inject
IEnumerable
,那么在使用

 services.AddSingleton<IMyClass, DefaultMyClass>();
 services.AddSingleton<IMyClass, MyClass>();
services.AddSingleton();
services.AddSingleton();

您可以对它们进行迭代。

您看过文档了吗?有没有什么地方不清楚它们的用法,你需要澄清一下?我找不到它们的区别@SamiKuhmonen?
 services.AddSingleton<IMyClass, DefaultMyClass>();
 services.AddSingleton<IMyClass, MyClass>();
 services.AddSingleton<IMyClass, DefaultMyClass>();
 services.TryAdd(ServiceDescriptor.Singleton<IMyClass, MyClass>());
 services.AddSingleton<IMyClass, DefaultMyClass>();
 services.AddSingleton<IMyClass, MyClass>();