2012-10-10 98 views
7

我剛剛閱讀了有關MVVMC模式的文章this。現在我有一個問題。應該將Controller注入到ViewModel中,還是應該將ViewModel注入到Controller中?實現MVVMC和依賴注入

+7

也許我是老土,但你真的需要這種模式?我對作者在鏈接文章中提出的理由印象不深。它似乎是爲了「假設」而不是違反YAGNI原則的「現在」編程。一些索賠也有點極端。無論何時您添加另一層抽象(這僅僅是我們所談論的UI層),解決方案的複雜性就會增加。我只是抱着一天,我們有MVVMCMVPVMVC ...來繪製一個控件。 –

+2

怎麼樣在ViewModel代碼混亂? –

+0

我想這取決於你如何定義「混亂」。你有一個具體的問題,你正在解決與添加一個控制器? –

回答

0

視圖模型是視圖和控制器之間的合同,理想並不需要了解(取決於)無論是。

所以我絕對不會注入一個控制器到ViewModel。

我不知道我會做相反的兩種:控制器通常用於創建新的視圖模型的實例負責。如果你想要一個更鬆散耦合的實現,你可以去注入一個抽象工廠到Controller中,以避免直接創建ViewModel類的新實例。

+0

但是,當我將控制器注入ViewModel時,它仍然是MVVM模式 - 事實上。控制器具有所有的邏輯,它被提供給(在一個控制器類中)View Model。 Controller中注入了很多服務。這是錯誤的? –

4

這取決於你在做什麼。我猜測大多數情況下控制器不需要注入,但如果需要的話,ViewModel更有可能需要注入。讓我解釋。

你在控制器上做什麼?你必須做某件事情。如果那個「某事」僅僅與「數據看起來像什麼」有關,那麼它就屬於視圖。如果它與「顯示給用戶的內容」有關,則它屬於ViewModel。

我正在注入一個控制器到我的一個ViewModels中。我的ViewModel表示隨後在視圖中繪製的數據。我有一個將數據項目從當前圖形移動到新圖形的命令。由於這改變了「在圖形窗口中顯示的內容」,我在ViewModel中實現了該命令。 ViewModel從其自己的項目集合中刪除數據項目,然後使用Controller來請求爲該新數據創建一個新視圖(它已具有此功能)。

縱觀本文,我看不到控制器和視圖 From the article you linked

7

的MVVMC是簡單地在查看由一個ViewModel對置換後的MVC之間的箭頭。

  • 該視圖僅與ViewModel交互,利用基於XAML技術的強大數據綁定機制。
  • ViewModel可以通知控制器,但不應該注入控制器。

我已經把MSDN上Josh Smith衆所周知的樣本基礎上的一個簡單樣本放在一起...在那裏我介紹了一個控制器。

0

我相信控制器應該注射作爲一個抽象一個IController。 ViewModel需要IController能夠導航到不同的View/ViewModel。

例如,在視圖模型:

IController _controller; 

public MyViewModel(IController controller){ 
    _controller = controller; 
} 

void NavigateHome(); 
{ 
    _controller.NavigateHome(); 
} 

抽象一個IController比注入控制器本身這些原因更好:

  1. 可測試性。您可以注入一個模擬IController並測試ViewModel去耦。 ViewModel不必知道控制器。

我開發了一個用於在WPF中執行MVVMC的輕量級框架。 它與Asp.NET Core中的MVC有很多相似之處。

如果您正在尋找WPF解決方案,請查看它。

博客文章與文檔: http://michaelscodingspot.com/2017/02/15/wpf-page-navigation-like-mvc-part-2-mvvmc-framework/

GitHub上: https://github.com/michaelscodingspot/WPF_MVVMC