【发布时间】: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