0

我用ninject为asp.net web api使用this文章创建了依赖解析器,它工作正常。但我有两个问题:asp.net web api依赖解析器与ninject:BeginScope

  1. 什么是BeginScope方法所需的?在asp.net mvc依赖解析器中没有这个方法,它工作正常;
  2. kernel.BeginBlock()方法的目的是什么?我从来没有用过它。

回答

2

通常Ninject不处理创建对象的处理,而是处理由垃圾收集器在对象超出范围时处理。垃圾收集器处置的问题是它是非确定性的,我们不知道它何时会发生!这对于稀缺资源(如数据库连接)可能不利。

BeginScope和Kernel.BeginBlock的想法非常类似于C#语言中的using()块。它强制清理范围块末尾由Ninject创建的所有对象。这些对象的处置将是确定性的,所有对象将尽可能短。

如果您使用Ninject.MVC5 nuget包,那么在ASP.NET MVC中它将注册一个http模块,该模块在请求结束时处理请求范围内的所有Ninject创建的类型。因此,不需要在控制器内创建和管理范围块。

我相信ASP.NET WebAPI的Ninject包会以相同的方式工作,但对不起,我没有经验。

我已经考虑过这些问题了,另一种方法是将工厂注入您的控制器,这些工厂创建您试图管理的一次性类型。然后在您的控制器中自行构建资源并使用正常的using()块控制其使用期限。