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

时间:2013-12-17 11:11:05

标签: java api domain-driven-design

我想为我的应用程序创建一个Core API,它负责与数据库交谈,以获取/保持实体对象与DB之间的连接。然后,Web应用程序可以使用此Core API,也可以在其上创建REST层。

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

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

}

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

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

以下是两个都是有效选项的情景。

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

即,客户端可以尝试导航 post.getPostedBy()。getPosts(),它返回null或空列表/集合,并且可能会认为此用户尚未发布任何内容。

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

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

2 个答案:

答案 0 :(得分:0)

这两个类可以作为POJO或数据对象吗? 如果它意味着你有一个用户表和一个帖子表,那么我认为你应该再有一个第三个只有这两个的Id。 使用它,您可以轻松找到哪个用户发布了哪个帖子或哪个帖子由哪个用户发布。

例如 公共类UserPosts {

private User user;
private Post post;


public UserPosts() {
}

答案 1 :(得分:0)

我会说Post应该只保存一个user_id,因为Post的存储不需要存储User - 它不是一个Aggregate Root。

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

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