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

问题描述

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

我有一个博客的“发布”模型,在某个时候我将不得不使用getAllPosts方法-从数据库中检索所有发布,并为每个实例实例化一个Post对象,这样我就可以显示他们的名单

如果用户拥有帖子,那么知道在哪里放置此代码将很容易-您将getPosts方法放在User模型上,它将返回属于该用户的帖子。

问题是:您在哪里放置处理模型的多个实例的方法,而这些实例不是由系统中的其他任何事物拥有?

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

  1. 只需通过PostController的index方法数据库进行交互。当然这是不对的,因为我的控制器不应该了解数据库,我希望它们解耦,这样将来的更改就不会很难实现

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

  3. 使用getAllPosts方法创建PostRepository。这是我当前的首选选项,但已阅读了有关存储库模式的信息(包括其与工作单元的链接等),感觉像是过分了。它还将实现与我认为应该在Post模型上使用的方法类似的方法,例如更新和删除

  4. 创建一个PostCollection类,该类负责与许多帖子相关的任何事情,而让Post类负责与单个帖子相关的任何事情。可以,但是我在其他地方都没有看到它的提法

  5. 为帖子创建无意义的“所有者”,例如User或Admin类,其中只有1个实例,并且仅包含getUserPosts方法

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

解决方法

选项#3是最好的选择,如果有交易操作,则最好创建工作单元模式。

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

请记住,在所有情况下,与域实体(用户,邮政)中的数据库进行数据通信都不是优选的,它们是独立的,应仅通过封装包含其自然行为。

您可能会发现以下架构很有用:Clean ArchitectureThe Onion ArchitectureHexagonal architecturePorts & Adapters Architecture

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...