我正在创建一个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;
}
如您所见,有两个重要对象:repositoryDetailsInternal
和repositoryDetailsOutput
。 repositoryDetailsInternal
是来自Github的解析响应数据,repositoryDetailsOutput
是我的webservice返回的输出对象。
我的问题是:每个对象是什么 - 实体还是值对象?
我倾向于调用repositoryDetailsInternal
一个实体和repositoryDetailsOutput
一个价值对象,但我想对此有一些第二意见。
一方面, repositoryDetailsInternal
可以随着时间的推移而改变(观星者计数可以增加或减少),但另一方面,在我的应用程序中,这个对象是不可变的。
编辑:我还应该提到使用所有者和存储库名称缓存repositoryDetailsInternal
,因此它可能被视为身份:
@Cacheable(REPO_DETAILS_CACHE)
public RepositoryDetailsInternal getRepositoryDetails(String owner, String repositoryName) throws TimeoutException {...}
repositoryDetailsOutput
也是不可变的,看起来像一个值对象,因为它代表了一种存储库状态的快照。
答案 0 :(得分:2)
据我所知,两个对象都是Value Objects
,即使Web服务返回的值因为没有 Identity
而有所不同。
我可以想象一个更复杂的情况,他们可能成为entities
,但我不知道这是否是你的情况(即你可以存储一个项目的星星的时间演变)。