我正在创建一个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
是我的Web服务返回的输出对象。我的问题是:这些对象分别是什么-实体还是值对象?
我倾向于将
repositoryDetailsInternal
称为实体,将repositoryDetailsOutput
称为值对象,但对此我需要一些其他意见。一方面,repositoryDetailsInternal
可以随时间而改变(观星者的数量会增加或减少),但在我的应用程序中,该对象是不可变的。编辑:我还应该提到repositoryDetailsInternal
是使用所有者和存储库名称进行缓存的,因此它可能被视为身份:@Cacheable(REPO_DETAILS_CACHE)
public RepositoryDetailsInternal getRepositoryDetails(String owner, String repositoryName) throws TimeoutException {...}
repositoryDetailsOutput
也是不可变的,并且看起来像一个值对象,因为它代表了存储库状态的一种快照。 最佳答案
根据我的判断,两个对象都是Value Objects
,即使Web服务返回的值可以变化,因为它们没有Identity
。
我可以想象一个更复杂的情况,在这种情况下它们可能会变成entities
,但我不知道这是否是您的情况(即,您可以将项目的发展时间存储在星空中)。