网状对象的返回
双向引用
在编程中会碰到以下情况
A.b=B
B.a=A
如果像DDD中进行仔细分析避免上面的情况当然好。但是有时无法避免时整个ValueObject就会变成网状关联。但是作为restful接口返回的时候应该是树状,当接收方收到后又可能倾向网状。如果考虑到对象的循环引用,应该有Repository来负责处理并cache。
class Repository1{
private Repository2 repository2;
private RemoteService1 service;
public ValueObject1 retrieve(String id){
TransferObject transferObject=service.retrieve(id);
return new ValueObject1(){
public String getId(){
return id;
}
public String getName(){
return transferObject.getName();
}
public ValueObject2 getValueObject2(){
if(null==transferObject.getValueObject2(){
return null;
}else{
return repository2.retrieve(transferObject.getValueObject2().getId());
}
}
}
}
}
Repository的cache
这里有两种方案,一种是本地cache,对每种业务对象建立cache并使用id作为主键
class CacheRepository{
private Repository repository;
private Map<String,ValueObject1> cache;
public ValueObject1 retrieve(String id){
ValueObject1 out=cache.get(id);
if(null==out){
out=repository.retrieve(id);
cache.put(id,out);
}
return out;
}
}
上面做法的一个问题是cache什么时候过期。
另一个方案是使用HTTP Status 304 来完成。但是这种做法无法保证Repeat Read