2011-11-18 63 views
5

您好我正在使用ninject與MVC應用程序。DI ninject爲控制器工作,但無法查看模型

我確定我已經正確安裝了,因爲我可以讓它爲我的控制器工作。這裏是控制器的一個例子,它工作正常:

public class GstRateController : Controller 
    { 
     private readonly IUnitOfWork _unitOfWork; 

     public GstRateController(IUnitOfWork unitOfWork) 
     { 
      _unitOfWork = unitOfWork; 
     } 
... 

然後,我認爲這也將是一個ViewModel好,所以我想,有:

public class SettingController : Controller 
    { 
     private readonly IUnitOfWork _unitOfWork; 

     public SettingController(IUnitOfWork unitOfWork) 
     { 
      _unitOfWork = unitOfWork; 
     } 

於是我實例化的視圖模型由控制器:

public ActionResult Index() 
     { 
      return View("Index", Activator.CreateInstance<SettingViewModel>()); 
     } 

但是,這是給我的錯誤:

否頁爲此對象定義的無參構造函數。

我是新來的DI。有人可以告訴我如何實現這個viewmodels?

+0

'Activator.CreateInstance ()'是反射,而不是Ninject。 Ninject使用'kernel.Get ()'顯式解析組件。但是你通常不應該在應用程序的中間使用內核。請參閱達林的回答。 –

回答

4

它適用於控制器而不是視圖模型的原因是因爲當您安裝NInject NuGet時,它會註冊一個自定義的依賴關係解析器,並且ASP.NET MVC框架使用控制器工廠或依賴關係解析器來實例化控制器。您可以在this article中閱讀有關依賴關係解析器的更多信息。

另一方面,查看模型是專門爲滿足給定視圖的要求而設計的類。由於您正在手動實例化它們,因此DI框架無法攔截並注入任何依賴關係。他們不應該有依賴關係。它們應該是從域模型映射的簡單POCO對象。他們代表一個或多個領域模型的項目。

+1

那麼如何實現「厚模態,薄控制器」?據我所知,處理數據或數據操縱的任何事情都應該在模型中。我們應該如何傳遞數據操縱器對象和/或上下文(即實體上下文)對象? – Seregwethrin