我已经搜索了很多关于这些问题,在这里和很多其他地方,但没有得到我想知道的一切!
- 从 WebApi 项目的角度来看,何时创建
InTransientScope
对象?在 Ninject 文档中指出,每当请求时都会创建此类对象,但在处理 HTTP 请求的 Web api 项目中,实例是在请求开始时创建的,因此在这方面它与InRequestScope
相同吗? -
在WebApi项目中,是否可以使用
InTransientScope
对象知道它们永远不会被Ninject跟踪?如果 Ninject 从不跟踪瞬态对象,那么这个作用域的目的是什么,这些对象在使用后会发生什么? -
如果我使用 InRequestScope 声明一个对象,而该对象没有实现
IDisposable
接口,那么在 Web 请求完成后,该对象会发生什么情况?是否会将其视为InTransientScope
对象? -
是否将不同的作用域用于:WebApi 控制器、存储库(使用单独创建的
InRequestScope
会话)和应用程序服务?
作用域有两个用途:
- 每个范围只允许创建一个对象
- (可选)在作用域结束后释放对象。
如前所述,处置是可选的。如果它没有实现IDisposable
接口,则不会释放它。这有很多用例。InTransientScope
是默认作用域 - 如果未指定另一个作用域,则使用该作用域。这意味着每次从内核请求类型A
时,都会进行一次激活并返回结果。激活逻辑由紧跟在Bind
部分之后的绑定部分指定(To<...>
、ToMethod(...)
,...)。 但是,这不一定是在 Web 请求启动和控制器实例化时。例如,您可以使用工厂或服务位置(p.Ex.ResolutionRoot.Get<Foo>()
) 在创建控制器后创建更多对象。简而言之,回答您的问题:
- 时间:当请求发生时,或者每当代码直接从 (
IResolutionRoot.Get(..)
) 或通过工厂向 Ninject 请求类型时。由于InTransientScope
对象未被跟踪,因此它们不会被释放,但是,如果它们不是一次性的并且整个请求代码仅请求一个IFoo
那么实际上它们的没有明显的区别(除了由于跟踪InRequestScope()
-ed对象而导致的性能轻微下降) - 只要您不需要确保共享和/或处置实例,这完全没问题。在不再使用它们之后,它们将被垃圾收集,就像您自己
new
的任何物品一样。 - 当作用域结束时,ninject 将删除对非
IDisposable
对象的弱引用。物体本身不会被触摸 - 就像绑定时一样InTransientScope()
- 这取决于您的具体要求和实施细节。通常,需要确保长范围对象不依赖于短范围对象。例如,单一实例服务不应依赖于请求范围的对象。作为基本规则,一切都应该
InTransientScope()
,除非有特定的原因不应该这样做。原因将决定使用什么范围...