使用ninject的asp.net web api依赖解析器:BeginScope

时间:2014-10-04 17:11:28

标签: c# asp.net-mvc asp.net-web-api dependency-injection ninject

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

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

1 个答案:

答案 0 :(得分:2)

通常,Ninject不处理已创建对象的处理,而是当对象超出范围时,处理由垃圾收集器处理。垃圾收集器处理的问题是它是不确定的,我们不知道什么时候会发生!这可能对数据库连接等稀缺资源不利。

BeginScope和Kernel.BeginBlock的想法很像C#语言中的using()块。它强制清除Ninject在范围块末尾创建的任何对象。然后处理这些物体将是确定性的,并且所有物体都将尽可能短暂。

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

我相信ASP.NET WebAPI的Ninject包可以以相同的方式运行,但很抱歉我没有使用它。

我之前已经考虑过这些问题,另一种方法是向您的控制器注入工厂,这些工厂会创建您尝试管理的一次性类型。然后在您的控制器中自己构建资源并使用正常的using()块控制其生命周期。