[英]Difference of singleton injection methods in .net core 2.1
What's the difference between these injection methods? 这些注射方法有什么区别?
services.TryAdd(ServiceDescriptor.Singleton<IMyClass, MyClass>());
services.AddSingleton<IMyClass, MyClass>();
services.TryAdd(ServiceDescriptor.Singleton<IMyClass, MyClass>());
Tries to register IMyClass
, if its already registered, nothing will happen and the previous registration remains the only one. 尝试注册
IMyClass
,如果它已经注册,则什么也不会发生,并且以前的注册仍然是唯一的一次。 This results in one IMyClass
registration. 这将导致一个
IMyClass
注册。
services.AddSingleton<IMyClass, MyClass>();
Will register IMyClass
anyways, even if there is a different registration already such as <IMyClass, DefaultMyClass>
. 无论如何都将注册
IMyClass
,即使已经存在其他注册,例如<IMyClass, DefaultMyClass>
。 This results in two IMyClass
registrations. 这将导致两个
IMyClass
注册。
The difference comes, when using provider.GetService
/ provider.GetRequriedService
or injecting IMyClass
vs IEnumerable<IMyClass>
. 当使用
provider.GetService
/ provider.GetRequriedService
或注入IMyClass
与IEnumerable<IMyClass>
。
When using provider.GetService
/ provider.GetRequriedService
or injecting IMyClass
, the last registration will be used (correct me if wrong, can't find the reference/GitHub issue on the quick). 当使用
provider.GetService
/ provider.GetRequriedService
或注入IMyClass
,将使用最后一个注册(如果出错,请更正我,无法快速找到参考/ GitHub问题)。
So if you had 所以如果你有
services.AddSingleton<IMyClass, DefaultMyClass>();
services.AddSingleton<IMyClass, MyClass>();
MyClass
instance will be returned when resolved. 解析后将返回
MyClass
实例。
Whereas 鉴于
services.AddSingleton<IMyClass, DefaultMyClass>();
services.TryAdd(ServiceDescriptor.Singleton<IMyClass, MyClass>());
would return DefaultMyClass
, because <IMyClass,MyClass>
would not be registered. 将返回
DefaultMyClass
,因为不会注册<IMyClass,MyClass>
。
On the other side, when you use provider.GetServices(...)
(notice the plural version, with an s at the end) or inject IEnumerable<IMyClass>
, then you would return both instance when using 另一方面,当您使用
provider.GetServices(...)
(注意复数形式,末尾带有s )或注入IEnumerable<IMyClass>
时,使用时将返回两个实例
services.AddSingleton<IMyClass, DefaultMyClass>();
services.AddSingleton<IMyClass, MyClass>();
and you could iterate over them. 您可以遍历它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.