这两种注射方法有什么区别?
services.TryAdd(ServiceDescriptor.Singleton<IMyClass, MyClass>());
services.AddSingleton<IMyClass, MyClass>();
答案 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)
您可以遍历它们。