Ninject:HTTP 请求完成后,非一次性 InRequestScope 和 InTransientScope 对象



我已经搜索了很多关于这些问题,在这里和很多其他地方,但没有得到我想知道的一切!

  1. 从 WebApi 项目的角度来看,何时创建InTransientScope对象?在 Ninject 文档中指出,每当请求时都会创建此类对象,但在处理 HTTP 请求的 Web api 项目中,实例是在请求开始时创建的,因此在这方面它与InRequestScope相同吗?
  2. 在WebApi项目中,是否可以使用InTransientScope对象知道它们永远不会被Ninject跟踪?如果 Ninject 从不跟踪瞬态对象,那么这个作用域的目的是什么,这些对象在使用后会发生什么?

  3. 如果我使用 InRequestScope 声明一个对象,而该对象没有实现IDisposable接口,那么在 Web 请求完成后,该对象会发生什么情况?是否会将其视为InTransientScope对象?

  4. 是否将不同的作用域用于:WebApi 控制器、存储库(使用单独创建的InRequestScope会话)和应用程序服务?

作用域有两个用途:

  1. 每个范围只允许创建一个对象
  2. (可选)在作用域结束后释放对象。

如前所述,处置是可选的。如果它没有实现IDisposable接口,则不会释放它。这有很多用例。InTransientScope是默认作用域 - 如果未指定另一个作用域,则使用该作用域。这意味着每次从内核请求类型A时,都会进行一次激活并返回结果。激活逻辑由紧跟在Bind部分之后的绑定部分指定(To<...>ToMethod(...),...)。 但是,这不一定是在 Web 请求启动和控制器实例化时。例如,您可以使用工厂或服务位置(p.Ex.ResolutionRoot.Get<Foo>()) 在创建控制器后创建更多对象。简而言之,回答您的问题:

  1. 时间:当请求发生时,或者每当代码直接从 (IResolutionRoot.Get(..)) 或通过工厂向 Ninject 请求类型时。由于InTransientScope对象未被跟踪,因此它们不会被释放,但是,如果它们不是一次性的并且整个请求代码仅请求一个IFoo那么实际上它们的没有明显的区别(除了由于跟踪InRequestScope()-ed对象而导致的性能轻微下降)
  2. 只要您不需要确保共享和/或处置实例,这完全没问题。在不再使用它们之后,它们将被垃圾收集,就像您自己new的任何物品一样。
  3. 当作用域结束时,ninject 将删除对非IDisposable对象的弱引用。物体本身不会被触摸 - 就像绑定时一样InTransientScope()
  4. 这取决于您的具体要求和实施细节。通常,需要确保长范围对象不依赖于短范围对象。例如,单一实例服务不应依赖于请求范围的对象。作为基本规则,一切都应该InTransientScope(),除非有特定的原因不应该这样做。原因将决定使用什么范围...

最新更新