在启动时注册为Singleton,Scoped或Transient,Singleton意味着只会创建一个实例。
假设我们有一个UserInfo
services.AddSingleton<IUserInfo , UserInfo >();
此UserInfo填充在其他地方,可能是中间件,或者像phoneNumber这样的工厂。发送电子邮件......
如果我们将Singleton与User&#39; Fred&#39;然后用户&#39;杰克&#39;用户杰克是否让Freds实例完成数据,直到被Jacks Data覆盖?
因此,这意味着我们使用范围作为每个范围的实例,每个请求都会创建一个范围,如果您需要对userInfo执行更多操作,那么每个请求一次我们将使用Transient?
每次瞬态成为新实例
努力寻找一种方法来测试这些场景,感谢任何想法,谢谢。
答案 0 :(得分:3)
Singleton表示每个应用程序生命周期的新实例。 Scoped意味着每个请求的新实例。瞬态意味着每次注入新实例。
您可能遇到的问题是,在开发过程中,这些事情之间会有相当多的重叠。如果您只是一次注入它,在您刚刚进行了代码更改后,三个范围实际上没有区别,因为所有这些都将导致创建一个新实例。这是因为:
然而,在现实世界中#34;差异更明显。您的应用可能会持续数天,数周,数月,而不会重新启动。单例范围的实例将一直存在。瞬态几乎与它被注入的对象的范围有关。如果你将带有transient-scope的东西注入到具有singleton-scope的东西中,那么瞬态范围的实例实际上是单例范围的,只要它没有被注入到其他任何东西中。最后,请求范围是请求范围。新实例,每次请求,每次都是。
请注意,请求范围的实例不会与其他类型的范围实例一起使用,这一点非常重要。例如,数据库上下文通常是请求范围的。因此,您无法将其注入单一范围的内容。如果你尝试,你实际上会得到一个例外。但是,您可以采用另一种方式:将单例注入请求范围的实例。