Ninject:HTTP请求完成后,非一次性InRequestScope和InTransientScope对象会发生什么?

时间:2017-06-10 21:07:05

标签: ninject ninject.web.mvc

我已经搜索过很多关于这些问题的信息,here以及很多其他地方,但没有得到我想知道的一切!

  1. 从WebApi项目的角度来看,InTransientScope个对象何时被创建?在Ninject文档中声明这样的对象是在请求时创建的,但是在处理HTTP请求的web api项目中,实例是在请求开始时创建的,所以在这方面它与InRequestScope相同然后?
  2. 在WebApi项目中,是否可以使用InTransientScope个对象,知道它们永远不会被Ninject跟踪?如果Ninject从不跟踪Transient对象,那么这个范围的目的是什么?这些对象在使用后会发生什么?

  3. 如果我使用InRequestScope声明一个对象并且该对象没有实现IDisposable接口,那么在Web请求完成后该对象会发生什么?它的处理方式是否与InTransientScope对象相同?

  4. 是否可以使用不同的范围:WebApi控制器,存储库(使用单独创建的InRequestScope会话)和应用程序服务?

1 个答案:

答案 0 :(得分:1)

范围有两个目的:

  1. 每个范围仅允许创建一个对象
  2. (可选)在范围结束后处置该对象。
  3. 如上所述,处置是可选的。如果它没有实现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. 时一样
    5. 这取决于您的具体要求和实施细节。通常,需要确保长范围的对象不依赖于短范围的对象。例如,Singleton-Service不应该依赖于Request-scoped对象。作为一个基本规则,一切都应该是InTransientScope(),除非有一个特定的原因,为什么它不应该。原因将决定使用的范围......