【问题标题】:Why should I inject IHttpContextAccessor as a Singleton为什么我应该将 IHttpContextAccessor 作为 Singleton 注入
【发布时间】:2018-03-01 23:37:24
【问题描述】:

在我看到的所有IHttpContextAccessor 注入示例中,它都设置为单例。

例子:

How to add IHttpContextAccessor in the Startup class in the DI in ASP.NET Core 1.0? Injecting IHttpContextAccessor into ApplicationDbContext ASP.NET Core 1.0 .NET Core IHttpContextAccessor issue

我觉得这有点奇怪,因为HttpContext 看起来确实像是映射到请求的东西。在这种情况下AddScoped 不是更合适吗?

Singleton 真的是推荐的方式吗?我没有看到什么吗?

【问题讨论】:

    标签: c# asp.net asp.net-core httpcontext


    【解决方案1】:

    Singleton 真的是推荐的方式吗?

    是的

    根据与 GitHub 上提出的问题相关的 cmets

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

    在该示例中,您将其注册为单例。不应该是作用域实例吗?

    作为一个单例很好,因为后备存储是异步本地的。

    后来得到了回复

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

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

    【讨论】:

    • 我完全不理解这句话:“.NET Core 正在使用 AsyncLocal,它依赖于实例变量来跟踪 TLS 存储槽”。但是问题已经回答了!谢谢。
    • 我完全不同意这个答案。应该避免异步本地,请求范围应该是干净有效的方法。在这里查看简单有效的解决方案:stackoverflow.com/questions/49966858/…
    • “后备存储是异步本地的”:这是否意味着访问器将通过线程拥有一个单例实例(加上正确处理线程切换请求服务线程使用异步时会发生的情况)神奇地继续其他线程?)
    猜你喜欢
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多