【问题标题】:Ninject InRequestScope() vs InThreadScope()Ninject InRequestScope() 与 InThreadScope()
【发布时间】:2020-02-21 05:56:08
【问题描述】:

它们之间有什么区别? InRequestScope 依赖于 HttpContext.Current,它只能在请求线程中使用,所以它与 InThreadScope 有什么不同?

【问题讨论】:

    标签: c# asp.net dependency-injection ninject


    【解决方案1】:

    如果你在期望你的对象存在于 HttpRequest 的上下文中时声明一个绑定 InThreadScope,你会遇到很多问题:

    • 幻像对象:一个线程将用于处理许多请求。在线程开始为其第一个请求提供服务时实例化的一些对象将在其他请求的上下文中反复重用,您希望在其中实例化新对象
    • 对象泄漏 : 一些对象,如 SqlConnections 必须在请求结束时释放,直到线程被回收后才会释放,你无法控制
    • 随机上下文切换:异步/等待操作通常意味着线程切换。这将导致意外行为,因为工厂可能会在等待操作之前和之后返回不同的对象

    您不应在 HttpRequest 的上下文中使用 InThreadScope,因为您不应在同一上下文中使用 ThreadStatic 属性

    【讨论】:

    • 那么,如何在真正的请求范围内注入一些东西,这些东西可以跨线程使用,从请求线程运行?我需要为当前请求存储一个会话 id 并从任何应用程序层使用它,即使代码在另一个线程中运行。
    • @user3233682 您需要将会话 ID 作为参数传递给由 http 请求启动的后台线程。
    • 所以没有其他解决方案了吗?如果有上千种方法,这样好吗?如果从控制器调用某些服务方法并且该服务方法调用第 3 方 httpclient,则将其注入服务中。我应该在哪里传递我的会话 ID,并在创建对象时添加到标题中
    • @user3233682 例如,您可以将后台任务操作调用包装在另一个设置 ThreadStatic 字段的操作中,甚至定义一个新的自定义 Ninject 范围。我想你应该就这个问题发表一个单独的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2011-10-18
    • 2013-12-27
    • 1970-01-01
    相关资源
    最近更新 更多