2012-04-14 61 views
3

根據這個答案,從視圖中調用模型似乎沒問題。MVC接線;視圖和模型

Can I call a Model from a View?

現在我的問題是,如何將接線樣子?

控制器會將模型工廠傳遞給視圖嗎? (我認爲會破壞這個問題的目的,因爲它會爲了做到這一點,除非我理解錯繞過控制器)

或者

會查看在注射模型廠View的構造函數在視圖傳遞給控制器​​之前?

+0

這*可能取決於你的框架 – Michelle 2012-04-14 04:19:21

+0

取決於抽象層次VS.您正在尋找的性能可能會考慮使用依賴注入框架,該框架能夠根據模型創建視圖中的數據,以便查看映射。 (請參閱:http://en.wikipedia.org/wiki/Dependency_injection)另外,您實際使用的是什麼MVC? – 2012-04-14 04:19:58

+0

@ResistDesign我只是在研究MVC框架,我沒有看到太多的代碼,所以我想知道它的樣子。 – Tek 2012-04-14 04:24:45

回答

2

乍一看,我看不出有什麼問題。讓我們走過的替代品:

  1. 傳遞的原始模型到視圖,類型提示關閉通用模型接口

    從表面上看,這似乎確定。但是,如果您的模型在其apis中不一致(例如$model->getPerson($id),這很可能),這實際上將控制器模型和視圖緊密耦合在一起。

    由於您的觀點無法真正接受任何模型,因此從控制器注入原始模型可能有點過於自由,並且會打開通向未來的不一致或奇怪錯誤的大門。

  2. 跑過原始模型到視圖,類型暗示斷開所需的模型類

    這解決了由現有溶液liberalness問題,只有正確的模型可以被傳遞。但是現在你已經將這種觀點與這種模式進一步結合了。所以這不太好。

  3. 實例化視圖內的模型。

    這也不是一個理想的解決方案,因爲現在你不能嘲笑你的模型進行測試,並將視圖完全耦合到模型。一個明確的SOLID侵犯。

因此,基本上是留下注入模型的工廠。它允許視圖確定它需要哪個模型(並因此從工廠請求)。它允許模型被嘲笑(通過交換不同的工廠)。而且它還允許通過調整工廠返回的內容來傳遞任意模型。

因此,依賴關係現在鬆散耦合,而您依賴於工廠(這是更好的依賴)。

這是我的第一個想法。我需要進一步思考,看看是否有更清潔的解決方案,但你有它...