简体   繁体   English

.net core 2.1中单例注入方法的区别

[英]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或注入IMyClassIEnumerable<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM