为什么我应该将IHttpContextAccessor注入为Singleton?

21

在我所见过的所有关于IHttpContextAccessor注入的示例中,它都被设置为Singleton。

示例:

如何在ASP.NET Core 1.0的DI中的Startup类中添加IHttpContextAccessor? 将IHttpContextAccessor注入到ApplicationDbContext ASP.NET Core 1.0中 .NET Core IHttpContextAccessor问题

我觉得这有点奇怪,因为HttpContext看起来确实是与请求相关的东西。在这种情况下,AddScoped是否更合适呢?

Singleton真的是推荐的方法吗?我错过了什么吗?

1个回答

18

单例模式真的是推荐使用的方式吗?

是的

根据在 GitHub 上引发的一个问题的相关评论

https://github.com/aspnet/Hosting/issues/793#issuecomment-224828588

在那个示例中,你正在将它注册为一个 singleton。它不应该是一个 scoped 实例吗?

它作为单例是可以的,因为后备存储是异步本地的。

这收到了一条稍后的回复

https://github.com/aspnet/Hosting/issues/793#issuecomment-224924030

实际上,如果在 .NET Core 上将其注册为瞬态,则无法正常工作,因为 .NET Core 的实现使用 AsyncLocal,该实现依赖于实例变量来跟踪线程本地存储插槽。因此,在 .NET Core 上必须将其注册为单例。


2
我完全不理解这个语句:" .NET Core正在使用AsyncLocal,它依赖实例变量来跟踪TLS存储插槽"。但问题已经得到回答了!谢谢。 - Arthur Rizzo
我完全不同意这个答案。应该避免使用async local,而请求范围应该是干净和高效的方法。在这里可以看到一个简单有效的解决方案:https://stackoverflow.com/questions/49966858/scoped-service-access-http-context-without-ihttpcontextaccessor - Spi
“backing store is async local”:这是否意味着访问器将由线程拥有单例实例(并正确处理线程切换,当请求服务线程使用异步并在其他线程中继续时会发生什么?) - g.pickardou
2
“稍后回复”的内容已经过期无效。 - kirodge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接