“TryAddEnumerable(ServiceDescriptor)”和其他“TryAdd{lifetime}”调用之间的精确区别是什么?(这是一个关于IT技术的提问标题)

14

两个服务TryAddEnumerable(ServiceDescriptor)和另一组调用(TryAddSingleton,TryAddScoped,TryAddTransient)似乎做同样的事情 - 首先检查依赖注入容器中服务的先前注册情况,然后只有在该服务还未注册时才进行注册。

以下是相关文档的链接:https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection,它并没有真正澄清差异,我在谷歌搜索中也没有找到太多相关资料。

1个回答

33

好的,我找到了区别:

TryAdd{lifetime}() ... 例如 TryAddSingleton() ... 它查看 DI 容器,检查是否已经为给定的服务类型(接口)注册了任何实现类型(具体类)。如果是,则不会为服务类型(调用中给定的服务类型)注册实现类型(调用中给定的实现类型)。如果没有,则会进行注册。

TryAddEnumerable(ServiceDescriptor) 另一方面查看 DI 容器,检查是否已经为给定的服务类型注册了与调用中给定的实现类型相同的相同实现类型(具体类)。如果是,则不会为服务类型(调用中给定的服务类型)注册实现类型(调用中给定的实现类型)。如果没有,则会进行注册。这就是为什么在其中有Enumerable后缀的原因。该后缀表示它将为相同的服务类型注册多个实现类型!


8
感谢您回来并写下了您的发现! - M. Elghamry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接