【问题标题】:Dependency Injection DotNetCore Lifetime in the real world现实世界中的依赖注入 DotNetCore Lifetime
【发布时间】:2018-08-24 12:48:09
【问题描述】:

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

假设我们有一个 UserInfo

services.AddSingleton<IUserInfo , UserInfo >();

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

如果我们将 Singleton 与用户“Fred”一起使用,那么用户“Jack”会出现,用户 Jack 是否会使用数据完成 Freds 实例,直到它被 Jacks 数据覆盖?

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

Transient 每次都是一个新实例

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

【问题讨论】:

  • 问题让我想起了这一点 - stackoverflow.com/questions/38138100/…
  • @AlexanderS。谢谢,我已经看到了,可能是我不够清楚,这就是我选择使用真实世界用户场景的原因,我可以对其进行更多测试,但永远无法确定,因为很难让 2 个用户以非常接近的时间间隔进入!我认为这意味着单例最终可能会被覆盖,所以它可能会被限定范围?
  • the section titled Singleton VS Transient Example here。生命周期指示类实例何时超出范围。 Scoped 生命周期类似于单例,只是实例存储在HttpContext.Items 中,而不是类级别的容器变量中。

标签: c# dependency-injection .net-core asp.net-core-webapi


【解决方案1】:

单例意味着每个应用程序生命周期的新实例。 Scoped 表示每个请求的新实例。瞬态意味着每次注入新实例。

您可能遇到的问题是,在开发过程中,这些事物之间存在大量重叠。如果您只注入一次,那么在您刚刚进行代码更改之后,这三个范围实际上没有区别,因为所有这些都将导致创建一个新实例。这是因为:

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

但是,在“现实世界”中,差异更为明显。您的应用程序可能会持续数天、数周、数月而无需重新启动。一个单例范围的实例将一直存在。瞬态几乎与它被注入的对象的范围有关。如果您将具有瞬态作用域的东西注入到具有单例作用域的东西中,那么瞬态作用域的实例实际上是单例作用域的,只要它没有被注入到其他任何东西中。最后,请求范围就是请求范围。新实例,每次请求,每次。

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

【讨论】:

    猜你喜欢
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 2011-01-03
    • 2023-03-14
    相关资源
    最近更新 更多