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

Model view controller MVC-您将与模型的多个实例相关的方法放在哪里?,model-view-controller,model,decoupling,Model View Controller,Model,Decoupling,这是一个简单的问题,但我在任何地方都找不到直接的答案。这是我感兴趣的基本概念,所以我一直保持简单 假设我有一个博客的“post”模型,我将不得不在某个时候使用getAllPosts方法——从数据库中检索所有帖子,并为每个帖子实例化一个post对象,这样我就可以显示它们的列表 如果一个用户拥有这些帖子,那么知道将这些代码放在哪里就很容易了——您可以在用户模型上放置一个getPosts方法,它将返回属于该用户的帖子 问题是:您将处理模型的多个实例的方法放在哪里,这些实例不属于系统中的任何其他对象 我

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

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

如果一个用户拥有这些帖子,那么知道将这些代码放在哪里就很容易了——您可以在用户模型上放置一个getPosts方法,它将返回属于该用户的帖子

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

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

  • 只需通过后控制器的索引方法与数据库交互即可。当然,这不可能是正确的,因为我的控制器不应该知道数据库,我希望它们解耦,以便将来的更改不会很难实现

  • 将getAll方法作为静态方法放在Post模型上,这样就不需要Post实例来调用它。我已经读到静态方法使事情难以测试,这违反了OOP的原则

  • 使用getAllPosts方法创建PostRepository。这是我当前的首选选项,但在阅读了存储库模式及其与工作单元的链接等之后,感觉有些过头了。它还将实现类似于我认为应该在Post模型上实现的方法,比如update和delete

  • 创建一个PostCollection类,该类负责与许多帖子相关的任何内容,并将Post类留给与单个帖子相关的任何内容。这没关系,但我在别处没看到有人提到过

  • 创建一个毫无意义的posts“所有者”,比如User或Admin类,其中只有一个实例,它只包含一个getUserPosts方法

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

    选项3是最好的方法,最好是在存在事务操作的情况下创建工作单元模式

    另一个选项是创建一个服务层(ManagePostsService),该服务层可用作与多个实体一起工作的DomainService,该服务将调用存储库或工作单元,请参阅

    请记住,在所有情况下,都不希望与数据源(例如来自域实体(用户、Post)的数据库)进行通信,这些数据源是独立的,只应通过封装包含其自然行为


    您可能会发现这些架构非常有用:,并且

    谢谢@Bassem!这真的很有帮助。如果其他人有其他建议,我会在这里多留一会儿,但我感谢你的建议response@pancakes32非常感谢。