2010-11-22 71 views
7

我有這種情況在我的應用程序:MVC - 從另一個模型參考模型

  • 控制器1

    • .GetItems()
  • 型號1

    • .GetItems()
  • 控制器2

    • .GetCurrentUser()
  • Model2的

    • .CurrentUser

在這種情況下Controller1.GetItems()調用Model1.GetItems()方法。 Model1.GetItems()方法需要知道(例如)當前用戶構建正確項目列表的角色是什麼,它應該從Model2.CurrentUser屬性獲取它(存儲關於當前用戶的緩存信息)。

從另一個模型訪問模型是否是一種很好的做法?

感謝, 問候

回答

3

你會遇到一些關於這樣做的最佳方式的爭論,但在一天結束時,你有兩個選擇。您可以讓模型從其他模型中提取需要的信息,也可以讓控制器傳遞所需的信息。

根據我已閱讀的內容,只要模型沒有任何控制器邏輯或查看邏輯,您就很好,因此讓該模型知道其他模型沒有任何問題。然而,其他人認爲,讓控制器傳遞所需的信息使得代碼更容易記錄,因爲您可以看到該模型需要來自其他地方的信息。儘管如此,我認爲這兩者都是有效的,你選擇使用哪一個可能會歸結爲個人偏好。


設計 - 控制器提供數據

ModelOne

  • 用戶GetCurrentUser()

ModelTwo

  • 項目[] GetItems(用戶)

片段 - 控制器Proivdes數據

Controller { 
    function doWork() { 
    User user = ModelOne.GetCurrentUser(); 
    Items[] items = ModelTwo.GetItems(user); 
    } 
} 

設計 - Model獲取數據

沫傑洛涅

  • 用戶GetCurrentUser()

ModelTwo

  • 項目[] GetItems()

片段 - Model獲取數據

ModelTwo { 
    Items[] GetItems() { 
    User user = ModelOne.GetCurrentUser(); 

    ... 

    } 
} 

Controller { 
    function doWork() { 
    Items[] items = ModelTwo.GetItems(); 
    } 
} 
1

我覺得你不應該有模型之間的引用,正確的方法是使用控制器此鏈接。所以在你的情況下,你可以將CurrentUser作爲GetItems方法中的一個參數傳遞。

+0

所以,你說我應該引用Controller1內的兩個模型,然後在Controller1.GetItems()內我應該:1)調用Model2.GetCurrentUser()並獲取用戶; 2)調用Model1.GetItems(用戶)將它傳遞給用戶。對? – Stefano 2010-11-22 15:40:50

+0

是的,如果這兩個模型將用於相同的流程中,我認爲在一個控制器中執行它是有意義的。或者,如果您需要連接到模型的控制器作爲抽象模式的一部分,則可以使用第三個控制器,該控制器對兩個控制器都有引用,並執行相同的操作。 – dain 2010-11-22 15:44:10

3

如果你的第二個模型會經常被你的第一個模型引用,你可以將你的模型類編譯到一個單獨的庫中?

+0

模型類已經編譯成單獨的程序集。這有什麼問題?我不明白。 – Stefano 2010-11-22 15:43:59