簡體   English   中英

.net core 2.1中單例注入方法的區別

[英]Difference of singleton injection methods in .net core 2.1

這些注射方法有什么區別?

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

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

嘗試注冊IMyClass ,如果它已經注冊,則什么也不會發生,並且以前的注冊仍然是唯一的一次。 這將導致一個IMyClass注冊。

 services.AddSingleton<IMyClass, MyClass>(); 

無論如何都將注冊IMyClass ,即使已經存在其他注冊,例如<IMyClass, DefaultMyClass> 這將導致兩個IMyClass注冊。

當使用provider.GetService / provider.GetRequriedService或注入IMyClassIEnumerable<IMyClass>

當使用provider.GetService / provider.GetRequriedService或注入IMyClass ,將使用最后一個注冊(如果出錯,請更正我,無法快速找到參考/ GitHub問題)。

所以如果你有

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

解析后將返回MyClass實例。

鑒於

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

將返回DefaultMyClass ,因為不會注冊<IMyClass,MyClass>

另一方面,當您使用provider.GetServices(...) (注意復數形式,末尾帶有s )或注入IEnumerable<IMyClass>時,使用時將返回兩個實例

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

您可以遍歷它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM