我剛剛閱讀了有關MVVMC模式的文章this。現在我有一個問題。應該將Controller注入到ViewModel中,還是應該將ViewModel注入到Controller中?實現MVVMC和依賴注入
回答
視圖模型是視圖和控制器之間的合同,理想並不需要了解(取決於)無論是。
所以我絕對不會注入一個控制器到ViewModel。
我不知道我會做相反的兩種:控制器通常用於創建新的視圖模型的實例負責。如果你想要一個更鬆散耦合的實現,你可以去注入一個抽象工廠到Controller中,以避免直接創建ViewModel類的新實例。
但是,當我將控制器注入ViewModel時,它仍然是MVVM模式 - 事實上。控制器具有所有的邏輯,它被提供給(在一個控制器類中)View Model。 Controller中注入了很多服務。這是錯誤的? –
這取決於你在做什麼。我猜測大多數情況下控制器不需要注入,但如果需要的話,ViewModel更有可能需要注入。讓我解釋。
你在控制器上做什麼?你必須做某件事情。如果那個「某事」僅僅與「數據看起來像什麼」有關,那麼它就屬於視圖。如果它與「顯示給用戶的內容」有關,則它屬於ViewModel。
我正在注入一個控制器到我的一個ViewModels中。我的ViewModel表示隨後在視圖中繪製的數據。我有一個將數據項目從當前圖形移動到新圖形的命令。由於這改變了「在圖形窗口中顯示的內容」,我在ViewModel中實現了該命令。 ViewModel從其自己的項目集合中刪除數據項目,然後使用Controller來請求爲該新數據創建一個新視圖(它已具有此功能)。
縱觀本文,我看不到控制器和視圖
的MVVMC是簡單地在查看由一個ViewModel對置換後的MVC之間的箭頭。
- 該視圖僅與ViewModel交互,利用基於XAML技術的強大數據綁定機制。
- ViewModel可以通知控制器,但不應該注入控制器。
我已經把MSDN上Josh Smith衆所周知的樣本基礎上的一個簡單樣本放在一起...在那裏我介紹了一個控制器。
我相信控制器應該注射作爲一個抽象一個IController。 ViewModel需要IController能夠導航到不同的View/ViewModel。
例如,在視圖模型:
IController _controller;
public MyViewModel(IController controller){
_controller = controller;
}
void NavigateHome();
{
_controller.NavigateHome();
}
抽象一個IController比注入控制器本身這些原因更好:
- 可測試性。您可以注入一個模擬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/
- 1. Autofac依賴注入實現
- 2. 依賴注入的實現
- 3. 依賴注入實現
- 4. 依賴注入和具體的依賴實現
- 5. 依賴注入的實現像角
- 6. 如何手動實現依賴注入?
- 7. 春天依賴注入匿名實現
- 8. 向IWindsorInstaller實現注入依賴關係
- 9. 依賴注入實現簡單
- 10. 實現依賴注入混淆
- 11. 用Vaadin和Spring Boot實現依賴注入的好實踐
- 12. EF:實體依賴注入
- 13. 依賴注入和依賴不使用
- 14. 實體框架和依賴注入
- 15. 依賴注入和多個實例
- 16. 依賴注入和顯式接口實現
- 17. 依賴注入和接口的很多實現
- 18. 可能實現的ControllerFactory和IHttpControllerActivator在MVC4依賴注入?
- 19. 依賴注入
- 20. 依賴注入
- 21. 依賴注入
- 22. 依賴注入
- 23. 依賴注入
- 24. 依賴注入
- 25. Grails @DelegateAsync和依賴注入
- 26. .NET ClaimsAuthenticationManager和依賴注入
- 27. 依賴注入和JavaScriptConverter.Deserialize
- 28. 依賴注入和測試
- 29. CA2000和依賴注入
- 30. WCF和依賴注入
也許我是老土,但你真的需要這種模式?我對作者在鏈接文章中提出的理由印象不深。它似乎是爲了「假設」而不是違反YAGNI原則的「現在」編程。一些索賠也有點極端。無論何時您添加另一層抽象(這僅僅是我們所談論的UI層),解決方案的複雜性就會增加。我只是抱着一天,我們有MVVMCMVPVMVC ...來繪製一個控件。 –
怎麼樣在ViewModel代碼混亂? –
我想這取決於你如何定義「混亂」。你有一個具體的問題,你正在解決與添加一個控制器? –