在Ninject中处理绑定对象

时间:2011-07-25 16:04:18

标签: asp.net-mvc-3 ninject

我绑定了DonorContext类的对象(它派生自EntityFramework的DbContext),如下所示在Global.ascx中。

kernel.Bind<DonorContext>().ToSelf().InRequestScope().OnDeactivation(DisposeDonorContext);

我期待在请求结束时,Ninject将调用DisposeDonorContext方法。但它永远不会被召唤。

我可以从网上收集的是IDisposible类型的对象在超出范围时会自动调用它们的Dispose方法。这种情况在我的情况下没有发生,因此我尝试使用OnDeactivation()来处理DonorContext(也不会发生)。

为什么处理没有发生的任何想法?

1 个答案:

答案 0 :(得分:2)

Ninject将自动调用实现IDisposable的对象的Dispose方法(至少那是我用最新版本测试时发生的情况)。如果您没有这样做,我怀疑问题是您从未在应用程序的任何位置使用此DonorContext。所以它永远不会被实例化,永远不会被处置掉。例如,如果您有一个控制器将此上下文作为构造函数参数:

public class HomeController: Controller
{
    private readonly DonorContext _context;
    public HomeController(DonorContext context)
    {
        _context = context;
    }

    public ActionResult Index()
    {
        return View();
    }
}

它应该工作。如果你有一个服务层将这个上下文作为构造函数参数然后你在控制器中使用这个服务(使用构造函数注入),它也会工作。在一天结束时,你必须有一个控制器,它需要一些依赖,它本身可能是DonorContext或一些其他依赖,它本身依赖于DonorContext(存储库,服务,...),以便触发依赖注入链。

这就是说在你的控制器中使用诸如 DonorContext 之类的具体类型会破坏使用依赖注入的目的,因为你正在硬编码它。