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()塊控制其使用期限。