网状关联下Restful返回对象

网状对象的返回

双向引用

在编程中会碰到以下情况

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值