我已经搜索过很多关于这些问题的信息,here以及很多其他地方,但没有得到我想知道的一切!
InTransientScope
个对象何时被创建?在Ninject文档中声明这样的对象是在请求时创建的,但是在处理HTTP请求的web api项目中,实例是在请求开始时创建的,所以在这方面它与InRequestScope
相同然后? 在WebApi项目中,是否可以使用InTransientScope
个对象,知道它们永远不会被Ninject跟踪?如果Ninject从不跟踪Transient对象,那么这个范围的目的是什么?这些对象在使用后会发生什么?
如果我使用InRequestScope声明一个对象并且该对象没有实现IDisposable
接口,那么在Web请求完成后该对象会发生什么?它的处理方式是否与InTransientScope
对象相同?
是否可以使用不同的范围:WebApi控制器,存储库(使用单独创建的InRequestScope
会话)和应用程序服务?
答案 0 :(得分:1)
范围有两个目的:
如上所述,处置是可选的。如果它没有实现IDisposable
接口,则它不被处置。为此提供了大量的用例。
InTransientScope
是默认范围 - 如果您未指定另一个范围,则使用该范围。这意味着每次从内核请求类型A
时,都会发生一次激活并返回结果。激活逻辑由紧随Bind
部分(To<...>
,ToMethod(...)
,...)之后的绑定部分指定。
但是,这不一定是在web请求开始并且控制器被实例化时。例如,您可以使用工厂或服务位置(p.Ex。ResolutionRoot.Get<Foo>()
)在创建控制器后创建更多对象。简而言之:
IResolutionRoot.Get(..)
)或通过工厂从Ninject请求类型时。由于InTransientScope
对象未被跟踪,因此它们不会被丢弃,但是,如果它们不是一次性的,并且整个请求代码只请求一个IFoo
,那么实际上那里没有可辨别的区别(分开)从导致整个InRequestScope()
- ed对象的轻微性能影响new
那样被任何对象收集垃圾。IDisposable
对象的弱引用。不会触及对象本身 - 就像绑定InTransientScope()
InTransientScope()
,除非有一个特定的原因,为什么它不应该。原因将决定使用的范围......