Model view controller MVC-从另一个模型中引用一个模型

Model view controller MVC-从另一个模型中引用一个模型,model-view-controller,design-patterns,Model View Controller,Design Patterns,我在我的应用程序中遇到了以下情况: 控制器1 .GetItems() 模型1 .GetItems() 控制器2 .GetCurrentUser() 模型2 .当前用户 在这个场景中,Controller1.GetItems()调用Model1.GetItems()方法。Model1.GetItems()方法需要知道(例如)当前用户的角色是什么来构建正确的项目列表,并且应该从Model2.CurrentUser属性(存储当前用户的缓存信息)中获取它 从另一个模型访问一个模型是一

我在我的应用程序中遇到了以下情况:

  • 控制器1

    • .GetItems()
  • 模型1

    • .GetItems()
  • 控制器2

    • .GetCurrentUser()
  • 模型2

    • .当前用户
在这个场景中,Controller1.GetItems()调用Model1.GetItems()方法。Model1.GetItems()方法需要知道(例如)当前用户的角色是什么来构建正确的项目列表,并且应该从Model2.CurrentUser属性(存储当前用户的缓存信息)中获取它

从另一个模型访问一个模型是一种好的做法吗

谢谢,
关于

我认为模型之间不应该有引用,正确的方法是使用控制器进行此链接。因此,在您的情况下,您可以在GetItems方法中将CurrentUser作为参数传递。

如果您的第二个模型经常被第一个模型引用,您可以将您的模型类编译到一个单独的库中?

您将遇到一些关于最佳方法的争论,但最终,您有两个选择。您可以让模型从另一个模型中提取所需的信息,也可以让控制器传递所需的信息

根据我所读到的,只要模型没有任何控制器逻辑或视图逻辑,您就很好,因此让模型了解其他模型没有什么错。然而,其他人认为,让控制器传递所需的信息会使代码更容易记录,因为您可以看到模型需要来自其他地方的信息。但最终,我认为两者都是有效的,你选择使用哪一种可能取决于个人偏好


设计-控制器提供数据

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

    ...

  }
}

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

  • 用户GetCurrentUser()
模式二

  • Items[]GetItems(用户)
代码段-控制器提供数据

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

    ...

  }
}

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

设计-模型获取数据

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

    ...

  }
}

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

  • 用户GetCurrentUser()
模式二

  • Items[]GetItems()
代码片段-模型获取数据

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

    ...

  }
}

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

所以,你说我应该在Controller1中引用两个模型,然后在Controller1.GetItems()中引用:1)调用Model2.GetCurrentUser()并获取用户;2) 调用Model1.GetItems(user)并将其传递给用户。是吗?是的,如果这两个模型将在同一流程中使用,我认为在一个控制器中使用是有意义的。或者,如果需要将控制器耦合到模型作为抽象模式的一部分,则可以使用第三个控制器,该控制器对两个控制器都有引用,并执行相同的操作。模型类已编译到单独的程序集中。这有什么问题?我不明白,谢谢。因此,我更喜欢该模型从另一个模型获取数据。原因是:在stackoverflow上发布问题简化了场景。在真实场景中,模型可能还需要其他模型(例如,拥有当前用户忠诚度信息的另一个模型)提供的其他可扩展信息。因此,我更喜欢将逻辑集中在Model1.GetItems()中,该逻辑将使用生成正确项目列表所需的所有模型。