2010-11-22 76 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