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

时间:2018-10-25 06:59:06

标签: c# asp.net-core .net-core

这两种注射方法有什么区别?

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

services.AddSingleton<IMyClass, MyClass>();

1 个答案:

答案 0 :(得分:2)

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或注入 services.AddSingleton<IMyClass, DefaultMyClass>(); services.AddSingleton<IMyClass, MyClass>(); 时,将使用最后的注册(如果出错,请更正我,无法快速找到参考/ GitHub问题)。

如果您有

MyClass

services.AddSingleton<IMyClass, DefaultMyClass>(); services.TryAdd(ServiceDescriptor.Singleton<IMyClass, MyClass>()); 实例将在解决后返回。

DefaultMyClass

将返回<IMyClass,MyClass>,因为provider.GetServices(...)将不会被注册。

另一方面,当您使用IEnumerable<IMyClass>(注意复数形式,末尾带有 s )或注入 services.AddSingleton<IMyClass, DefaultMyClass>(); services.AddSingleton<IMyClass, MyClass>(); 时,您将同时返回两个实例使用时

multicast().to(A, B, C)

您可以遍历它们。