【问题标题】:asp.net web api dependency resolver with ninject: BeginScope带有ninject的asp.net web api依赖解析器:BeginScope
【发布时间】:2014-10-04 17:11:28
【问题描述】:
我使用this 文章为asp.net web api 创建了带有ninject 的依赖解析器,它工作正常。但我有两个问题:
- BeginScope 方法需要什么? asp.net mvc依赖解析器中没有这个方法,运行正常;
- kernel.BeginBlock() 方法的用途是什么?我没用过。
【问题讨论】:
标签:
c#
asp.net-mvc
asp.net-web-api
dependency-injection
ninject
【解决方案1】:
通常 Ninject 不处理已创建对象的处置,而是在对象超出范围时由垃圾收集器处理处置。垃圾收集器处理的问题是它是不确定的,我们不知道它什么时候会发生!这可能对数据库连接等稀缺资源不利。
BeginScope 和 Kernel.BeginBlock 的思想很像 C# 语言中的 using() 块。它强制清除 Ninject 在范围块末尾创建的任何对象。然后,这些对象的处置将是确定性的,并且所有对象的寿命都将尽可能短。
当涉及到 ASP.NET MVC 时,如果您使用 Ninject.MVC5 nuget 包,它将注册一个 http 模块,该模块会在请求结束时处理在请求范围内的所有 Ninject 创建的类型。因此,不需要在控制器内创建和管理范围块。
我相信 ASP.NET WebAPI 的 Ninject 包会以相同的方式运行,但抱歉我没有这方面的经验。
我之前已经考虑过这些问题,另一种方法是向您的控制器注入工厂,这些工厂创建您尝试管理的一次性类型。然后在您的控制器中自己构建资源并使用普通的using() 块控制其生命周期。