2012-03-05 79 views
0

我發現自己需要讓View公開它的模型和控制器引用。這是不好的設計的氣味?或者這被認爲是「安全」的做法?MVC範例:從視圖中揭示模型和控制器

例如:我有一個列表(的ListViewListControllerListModel組成)和許多列表項(的ItemViewItemControllerItemModel組成)。

當我創建ItemModelItemView,並且ItemController列表的每個項目,我通過ItemView實例關閉的ListView。但是,稍後,我的ListController需要參考相應的ItemController實例。

所以,這將是更恰當的同時通過ItemViewListView::addItem()ItemController,或只是通過在ItemView和暴露爲ItemView::getController()實例方法等?

還是沒關係?每種方法均可行嗎?如果遵循他們的邏輯結論,兩種策略都會導致反模式嗎?

+0

'但是,在稍後的時間點,我的ListController需要對相應的ItemController實例的引用 - 爲什麼?如果你正確地解耦你的類,你不應該需要這個。 – 2012-03-05 19:24:06

+0

'當我創建ItemModel,ItemView和ItemController'時,您爲列表中的每個項目創建一個控制器? - 這對我來說是一種氣味。 – 2012-03-05 19:33:53

+0

你在說網絡或桌面應用程序嗎?它們是有區別的。 – 2012-03-05 19:48:43

回答

1

但是,在以後的某個點上,我ListController需要相應的ItemController實例

爲什麼一個參考?如果你正確地解耦你的類,你不應該需要這個。

控制器幾乎總是處理一個功能域。這樣一個域的例子可能是「銷售」或「管理員」。另外,MVC還支持使用「區域」,它提供了額外的組織等級。

添加對來自其他控制器的控制器的引用與此組織結構是交叉目的。如果你需要結合功能來讓你的代碼更幹,普通的重構就可以實現這一點。您也可以從包含通用功能的基類中繼承控制器

+0

偉大的洞察力 - 謝謝! – 2012-03-07 17:15:40

0

考慮到你實際上沒有顯示任何代碼。 在我看來,你應該改變你的設計。控制器不應該與其他控制器(直接)通信,MVC規定:reference

如果您需要從另一個控制器調用控制器操作,請考慮使用委託或組合。而不是直接調用控制器操作。

1

在mvc模式中,用戶請求應該被路由到一個控制器,比如說invoicecontroller,它有動作。 可以說,默認操作Index返回發票清單;然後控制器創建一個包含發票對象列表的模型,實例化正確的視圖並將模型注入到視圖中。 現在,它的意見轉而做它的魔力。它使用它所具有的數據呈現最佳視圖,其中可能包括路由到一個或多個控制器。 在任何情況下,視圖(或模型)都應該自己執行業務邏輯。這就是說,我完全同意Jakub。希望有所幫助。

相關問題