gpt4 book ai didi

c# - 现实世界中的依赖注入(inject) DotNetCore 生命周期

转载 作者:太空宇宙 更新时间:2023-11-03 22:47:15 26 4
gpt4 key购买 nike

在启动时注册为 Singleton、Scoped 或 Transient,Singleton 意味着只会创建一个实例。

假设我们有一个 UserInfo

services.AddSingleton<IUserInfo , UserInfo >();

并且这个 UserInfo 在其他地方填充,可能是中间件,或者像带有 phoneNumber 的工厂这样的服务。电子邮件等等...

如果我们将单例与用户“Fred”一起使用,那么用户“Jack”出现了,用户 Jack 是否会获得包含完整数据的 Freds 实例,直到它被 Jacks 数据覆盖?

所以这意味着我们使用 scoped,因为它是每个范围的一个实例,每个请求都会创建一个范围,如果您需要对 userInfo 做更多的事情,而不是每个请求一次,我们会使用 Transient 吗?

Transient 每次都是一个新实例

努力寻找一种方法来测试这些场景任何想法赞赏,谢谢。

最佳答案

单例意味着每个应用程序生命周期都有新的实例。范围意味着每个请求的新实例。 Transient 意味着每次注入(inject)新实例。

您可能遇到的问题是,在开发过程中,这些事情之间存在相当多的重叠。如果您只注入(inject)一次,在您刚刚更改代码后,三个范围实际上没有区别,因为所有这些都会导致创建一个新实例。这是因为:

  1. 在单例范围内,由于代码更改,网站刚刚重新启动。因此,这是一个需要新实例的全新流程。
  2. 使用请求范围,您正在发出请求,因此您总是会获得一个新实例
  3. 对于 transient 作用域,您只能注入(inject)一次,因此只会创建一个实例。

然而,在“现实世界”中,差异更为明显。您的应用程序可能会运行数天、数周、数月,而不会重新启动。单例范围的实例将一直存在。 Transient 几乎受限于它被注入(inject)的对象的范围。如果您将具有 transient 作用域的东西注入(inject)到具有单例作用域的东西中,那么 transient 作用域的实例实际上是单例作用域的,只要它没有被注入(inject)到其他任何东西中。最后,请求范围是请求范围。新实例,每次请求,每次。

重要的是要注意,请求范围的实例往往不能与其他类型的范围实例很好地配合。例如,数据库上下文通常是请求范围的。因此,您不能将它注入(inject)到单例范围的东西中。如果你尝试,你实际上会得到一个异常(exception)。但是,您可以采用另一种方式:将单例注入(inject)到请求范围的实例中。

关于c# - 现实世界中的依赖注入(inject) DotNetCore 生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49304016/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com