Ninject InRequestScope() 与 InThreadScope()
Ninject InRequestScope() vs InThreadScope()
它们有什么区别? InRequestScope
依赖于 HttpContext.Current
,它只能从请求线程获得,所以它与 InThreadScope
不同吗?
如果您在希望对象存在于 HttpRequest 的上下文中时声明绑定 InThreadScope
,您将遇到很多问题:
- phantom objects : 一个线程将用于处理许多请求。在线程开始为它的第一个请求提供服务时实例化的一些对象将在其他请求的上下文中反复重用,您希望在这些上下文中实例化新对象
- 对象泄漏:一些必须在请求结束时处理的对象,如 SqlConnections,在线程被回收之前不会再被处理,这是你无法控制的
- 随机上下文切换 : async/await 操作通常意味着线程切换。这将导致意外行为,因为工厂可能 return 在等待操作之前和之后的不同对象
您不应在 HttpRequest 的上下文中使用 InThreadScope
,因为您不应在同一上下文中使用 ThreadStatic
属性
它们有什么区别? InRequestScope
依赖于 HttpContext.Current
,它只能从请求线程获得,所以它与 InThreadScope
不同吗?
如果您在希望对象存在于 HttpRequest 的上下文中时声明绑定 InThreadScope
,您将遇到很多问题:
- phantom objects : 一个线程将用于处理许多请求。在线程开始为它的第一个请求提供服务时实例化的一些对象将在其他请求的上下文中反复重用,您希望在这些上下文中实例化新对象
- 对象泄漏:一些必须在请求结束时处理的对象,如 SqlConnections,在线程被回收之前不会再被处理,这是你无法控制的
- 随机上下文切换 : async/await 操作通常意味着线程切换。这将导致意外行为,因为工厂可能 return 在等待操作之前和之后的不同对象
您不应在 HttpRequest 的上下文中使用 InThreadScope
,因为您不应在同一上下文中使用 ThreadStatic
属性