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

时间:2018-03-15 15:58:15

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

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

假设我们有一个UserInfo

services.AddSingleton<IUserInfo , UserInfo >();

此UserInfo填充在其他地方,可能是中间件,或者像phoneNumber这样的工厂。发送电子邮件......

如果我们将Singleton与User&#39; Fred&#39;然后用户&#39;杰克&#39;用户杰克是否让Freds实例完成数据,直到被Jacks Data覆盖?

因此,这意味着我们使用范围作为每个范围的实例,每个请求都会创建一个范围,如果您需要对userInfo执行更多操作,那么每个请求一次我们将使用Transient?

每次瞬态成为新实例

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

1 个答案:

答案 0 :(得分:3)

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

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

  1. 使用单例范围,由于代码更改,网站刚刚重新启动。因此,它是一个需要新实例的全新流程。
  2. 根据请求范围,您提出请求,因此您始终会获得新实例
  3. 对于瞬态范围,您只需注入一次,因此只创建一个实例。
  4. 然而,在现实世界中#34;差异更明显。您的应用可能会持续数天,数周,数月,而不会重新启动。单例范围的实例将一直存在。瞬态几乎与它被注入的对象的范围有关。如果你将带有transient-scope的东西注入到具有singleton-scope的东西中,那么瞬态范围的实例实际上是单例范围的,只要它没有被注入到其他任何东西中。最后,请求范围是请求范围。新实例,每次请求,每次都是。

    请注意,请求范围的实例不会与其他类型的范围实例一起使用,这一点非常重要。例如,数据库上下文通常是请求范围的。因此,您无法将其注入单一范围的内容。如果你尝试,你实际上会得到一个例外。但是,您可以采用另一种方式:将单例注入请求范围的实例。