实体与ValueObject

时间:2017-03-10 19:47:26

标签: java spring rest spring-mvc domain-driven-design

我正在创建一个RESTful Web服务,它从github检索存储库详细信息并返回它们。我的代码如下所示:

@GetMapping(value = "/{owner}/{repositoryName}")
@ResponseStatus(HttpStatus.OK)
public RepositoryDetails getRepositoryDetails(@PathVariable String owner, @PathVariable String repositoryName) throws Exception {
    log.info("Github repository details request: owner: " + owner + ", repository name: " + repositoryName);
    checkParameters(owner, repositoryName);
    RepositoryDetailsInternal repositoryDetailsInternal = repoService.getRepositoryDetails(owner, repositoryName);
    RepositoryDetails repositoryDetailsOutput = new RepositoryDetails(repositoryDetailsInternal, LocaleContextHolder.getLocale());
    return repositoryDetailsOutput;
}

如您所见,有两个重要对象:repositoryDetailsInternalrepositoryDetailsOutputrepositoryDetailsInternal是来自Github的解析响应数据,repositoryDetailsOutput是我的webservice返回的输出对象。
我的问题是:每个对象是什么 - 实体还是值对象?

我倾向于调用repositoryDetailsInternal一个实体和repositoryDetailsOutput一个价值对象,但我想对此有一些第二意见。
一方面, repositoryDetailsInternal可以随着时间的推移而改变(观星者计数可以增加或减少),但另一方面,在我的应用程序中,这个对象是不可变的。
编辑:我还应该提到使用所有者和存储库名称缓存repositoryDetailsInternal,因此它可能被视为身份:

@Cacheable(REPO_DETAILS_CACHE)
    public RepositoryDetailsInternal getRepositoryDetails(String owner, String repositoryName) throws TimeoutException  {...}



repositoryDetailsOutput也是不可变的,看起来像一个值对象,因为它代表了一种存储库状态的快照。

1 个答案:

答案 0 :(得分:2)

据我所知,两个对象都是Value Objects,即使Web服务返回的值因为没有 Identity 而有所不同。

我可以想象一个更复杂的情况,他们可能成为entities,但我不知道这是否是你的情况(即你可以存储一个项目的星星的时间演变)。