http://dddsample.sourceforge.net/
有趣的是,我发现它的仓储CargoRepository 是在Service中实现,而不是在模型Cargo中,模型Cargo是主要业务方法。
这和JiveJdon3处理方式类似,不过我真希望在模型中能够和谐处理好CRUD的点子。
我们在另外一个帖子讨论中(http://www.jdon.com/jivejdon/thread/35600.html),调用顺序是这样:
客户端--->服务 ---> repository
这是符合DDD定义的,基于服务的SOA就是那种全局唯一的入口,通过这个入口调用repository,而不是象infoQ里那样,将repository注射到Model中,因为Model中有自己的业务方法,这点从cargo这个模型代码看就很正常。
public TrackingId bookNewCargo(final UnLocode originUnLocode, final UnLocode destinationUnLocode) {
Validate.notNull(originUnLocode);
Validate.notNull(destinationUnLocode);
final TrackingId trackingId = cargoRepository.nextTrackingId();
final Location origin = locationRepository.find(originUnLocode);
final Location destination = locationRepository.find(destinationUnLocode);
Cargo cargo = new Cargo(trackingId, origin, destination);
cargoRepository.save(cargo);
logger.info("Registered new cargo with tracking id " + cargo.trackingId().idString());
return cargo.trackingId();
}
public List
Validate.notNull(trackingId);
final Cargo cargo = cargoRepository.find(trackingId);
final RouteSpecification routeSpecification = RouteSpecification.forCargo(cargo, new Date());
return routingService.fetchRoutesForSpecification(routeSpecification);
}
>>>>这是符合DDD定义的,基于服务的SOA就是那种全局唯一的入口,通过这个入口调用repository,而不是象infoQ里那样,将repository注射到Model中,因为Model中有自己的业务方法,这点从cargo这个模型代码看就很正常。
感觉最后还是成了贫血模型。
晕倒,cargo中那么业务方法(打开代码可以看到),还是贫血?那就让Evans和MartinF Fowler去掐架吧。
|
[该贴被banq于2009-02-25 18:37修改过]
俗话说一行代码胜千言万语,这个例子确实是学习ddd的好例子,各位别错过了.
或者说业务方法需要依赖数据库操作的时候怎么来处理呢?
在领域对象与数据库操作间加一个中介者?