java - 用于创建 API 的更好的域模型

标签 java api domain-driven-design

我想为我的应用程序创建一个核心 API,它负责与数据库通信以从数据库获取/保留实体对象。然后这个核心 API 可以被 Web 应用程序使用或在其之上创建一个 REST 层。

我正在构建一个论坛应用程序,并且正在创建域实体,例如:

class User
{
    int id;
    String username;
    ...
    List<Post> posts;

}

class Post
{
    int id;
    String title;
    ...
    User postedBy;
}

我正在考虑 Post 类是否应该包含引用发布它的用户的 User 对象,或者只包含 user_id (整数)。

以下场景表明这两个选项都是有效的。

如果我们想要显示帖子以及发布该帖子的用户的姓名/电子邮件,那么我们应该有 User 对象。另一方面,API 使用者可能会尝试浏览未完全加载的对象图。

即,客户端可以尝试导航 post.getPostedBy().getPosts(),它返回 null 或空列表/集,并可能得出结论该用户尚未发布任何内容。

如果 user_id 属性是整数,客户端将调用另一个方法来通过 user_id 获取帖子列表。

那么哪个选项更好地保存对父关系的引用?

最佳答案

我想说 Post 应该只保存一个 user_id,因为 Post 的存储不需要存储 User - 它不是一个聚合根。

但是说到本地和远程 API,对象之间发送消息还取决于延迟。如果延迟大于本地调用(假设通过 REST API),您希望在一次调用中发送尽可能多的信息以避免多次调用。但是,这会使域模型仅对于本地调用(在一个应用程序内 - 一台机器等)变得丑陋。

换句话说,REST API 将使用一些远程外观对象发送包含更多信息的 DTO(例如,将数据与用户数据一起发布) - 请参阅 PoEAA 中的“远程外观”。但是域模型将被建模为 User 和 Post 类的最佳结构,并由存储库 - PostRepository.getPostsByUser() 或类似的来获取。

关于java - 用于创建 API 的更好的域模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20632578/

相关文章:

java - EDT 违规是否可能导致外部软件出现 NullPointerException?

domain-driven-design - 处理来自映射对象的实体更新

domain-driven-design - .NET 的 DDD - 是否有可用的通用基础设施库?

java - 使用 spring 和 mongodb 根据我的查询获取文档列表

java - 将字符串转换为整数时出现 NumberFormatException

java - 将 tomcat 作为服务启动时出现无效的变音字符

java - hibernate 标准中 LEFT_JOIN 中的 OR 子句

python - Paypal 可以在没有公共(public)地址的情况下用于本地主机的生产吗?

php - 何时以及如何在具有跨域的书签中使用 !important CSS 属性?

nhibernate - nhibernate 的双向关系模式