c# - 为什么使用 AddScoped() 而不是 AddSingleton()?

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

为什么我应该为我的存储库或服务使用 AddScoped()?为什么不是 AddSingleton()? 我知道它们之间的区别,但不明白为什么我不应该使用单例实例来避免为每个请求创建新对象。 你能解释一下吗(最好有例子:))?

最佳答案

如您所说,您知道其中的区别,所以我不会深入讨论。

您不想为您的存储库或服务添加 Singleton 的原因是因为通常您的存储库和服务被视为“业务逻辑”和“持久性逻辑”。在您的业务逻辑中,您可能有一些正在设置的类级别变量。这些属性对于每个请求都不会不同,它们将在请求之间共享。 (将它们想象成静态属性)。

例子:

假设您有一个用户服务,它将发出请求的用户的用户名设置为类级别变量。

单例逻辑:

现在假设 Bob 向 API 发出请求。用户名将设置为 "Bob"。现在想象一下,约翰同时向 API 发出请求。用户名将设置为“John”。但是因为用户服务是单例的,John 和 Bob 共享同一个实例,这意味着 Bob 的用户名也将设置为“John”。

作用域逻辑:

想象一下与上面完全相同的场景,但是这次当 John 发出请求时,它不会覆盖 bobs 用户名,因为它们是不同的实例。

关于c# - 为什么使用 AddScoped() 而不是 AddSingleton()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72224682/

相关文章:

c# - Attribute.IsDefined 在 DNX Core 5.0 中去了哪里?

Symfony 4 - 服务被移除或内联,尽管它是公开的

c# - 我需要在简单注入(inject)器中注册具体的根类型吗?

c# - 文件扩展名后的空格 -> 奇怪的 FileInfo 行为

asp.net-core - ASP.Net Core OpenIdConnect Steam

C# 无法关闭后台 worker 创建的表单

c# - NET Core Cors 抛出错误

通过将类作为函数参数传递来调用类方法的 Swift 依赖注入(inject)

c# - 对象类型的SSIS变量到字符串的转换

c# - 在 Unity 中使用 Getters 和 Setters