TryAddEnumerable(ServiceDescriptor) 和其他 TryAdd{lifetime} 调用之间的确切区别是什么

services.TryAddEnumerable(ServiceDescriptor) 和另一组调用(TryAddSingleton、TryAddScoped、TryAddTransient)似乎都在做同样的事情——它们首先检查依赖注入容器中服务的先前注册,然后仅在它有时才注册它尚未注册。

这是文档的相关链接: https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection --- 它并没有真正阐明区别,我从谷歌搜索中找不到太多。

stack overflow What is the precise difference between TryAddEnumerable(ServiceDescriptor) and other TryAdd{lifetime} calls
原文答案
author avatar

接受的答案

好的,我发现了不同之处:

TryAdd {lifetime} () ... 例如 TryAddSingleton() ... 窥视 DI 容器并查找是否已为给定服务注册任何实现类型(具体类)类型(界面)。如果是,则它不会为服务类型(在调用中给出)注册实现类型(在调用中给出)。如果没有,那么它会。

另一方面, TryAddEnumerable (ServiceDescriptor) 窥视 DI 容器,寻找 SAME 实现类型(具体类)作为调用中给出的实现类型是否已经为给定的服务类型注册。如果是,则它不会为服务类型(在调用中给出)注册实现类型(在调用中给出)。如果不是,那就是。这就是为什么有 Enumberable 后缀的原因。 The suffix indicates that it will register more than one implementation types for the same service type!


答案: