MVC - 您将与模型的多个实例相关的方法放在哪里?

MVC - where do you put methods relating to multiple instances of your model?

这是一个简单的问题,但我无法在任何地方找到直接的答案。这是我感兴趣的基本概念,所以我保持简单...

假设我有一个用于博客的 'post' 模型,我将不得不在某些时候使用 getAllPosts 方法 - 从数据库中检索所有帖子,并实例化每个对象都有一个 Post 对象,这样我就可以显示它们的列表

如果用户拥有 Posts,那么知道将此代码放在哪里会很容易 - 您可以在用户模型上放置一个 getPosts 方法,它会 return 属于该用户的帖子。

问题是:您将处理模型的多个实例的方法放在哪里,而这些模型 属于系统中的任何其他对象?

我已经考虑了这些选项,并列出了我的顾虑:

  1. 只需从 PostController 的索引方法与数据库交互。这肯定是不对的,因为我的控制器不应该知道数据库,我希望它们解耦,以便将来的更改不会难以实现

  2. 将 getAll 方法作为静态方法放在 Post 模型上,这样您就不需要 Post 实例来调用它。我读过静态方法使事情难以测试,这违反了 OOP

    的原则
  3. 使用 getAllPosts 方法创建一个 Post 存储库。这是我当前的首选选项,但在阅读了有关存储库模式的信息后——及其与工作单元的链接等——感觉有点矫枉过正。它还会实现与我认为应该在 Post 模型上使用的方法类似的方法,例如更新和删除

  4. 创建一个 Post 集合 class,它负责与许多 Post 相关的任何事情,并留下 Post class 与单个 Post 相关的任何内容。没关系,但我没有在其他地方看到任何提及

  5. 创建一个毫无意义的 'owner' 帖子,例如用户或管理员 class,其中只有 1 个实例,它只是包含一个 getUserPosts 方法

解决这个问题最简单的方法是什么?

选项 #3 是最好的,最好创建工作单元模式以防事务操作。

另一种选择是创建一个服务层 (ManagePostsService),它可以用作与多个实体一起工作的 DomainService,该服务将调用存储库或工作单元,请参阅 Domain-Driven Design.

请记住,在所有情况下,最好不要与来自域实体(用户,Post)的数据源 e.g.database 进行通信,这些是独立的,并且应该只包含它们通过以下方式的自然行为封装。

您可能会发现这些架构很有用:Clean Architecture, The Onion Architecture, Hexagonal architecture and Ports & Adapters Architecture