现实世界中的依赖注入 DotNetCore 生命周期

Dependency Injection DotNetCore Lifetime in the real world

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

假设我们有一个 UserInfo

services.AddSingleton<IUserInfo , UserInfo >();

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

如果我们将 Singleton 与用户 'Fred' 结合使用,那么用户 'Jack' 会出现吗?用户 Jack 是否会获得包含完整数据的 Freds 实例,直到它被 Jacks 数据覆盖?

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

Transient 每次都是一个新实例

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

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

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

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

然而,在 "real world" 中,差异更为明显。您的应用程序可能会运行数天、数周、数月,而不会重新启动。 singleton-scoped 个实例将在整个过程中存活下来。 Transient 几乎受限于它被注入的对象的范围。如果你将带有 transient-scope 的东西注入到带有 singleton-scope 的东西中,那么 transient-scoped 实例实际上是 singleton-scoped,只要它没有被注入任何其他东西。最后,请求范围是请求范围。新实例,每次请求,每次。

重要的是要注意 request-scoped 实例往往不能与其他类型的范围实例一起使用。例如,数据库上下文通常是 request-scoped。因此,您不能将它注入 singleton-scoped 中。如果你尝试,你实际上会得到一个例外。但是,您可以采用另一种方式:将单例注入 request-scoped 实例。