![](/img/trans.png)
[英].NET Core 2.1 DbContext ObjectDisposedException Dependency Injection
[英]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
或注入IMyClass
與IEnumerable<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.