阅读本贴之前请先阅读如下几个帖子
Domain Event 救世主
Domain Event 异步应用
DCI架
智能领域对象设计
领域对象应该有丰富的业务行为,它们不应该感知技术环境,技术环境应该为domain服务,domain对象还可能在不同场景里面表现出不同的行为和具备相关场景属性,所以jdon做的是在挑战传统ssh编程模式,ssh被banq喻为模型层的汇编语言,下面以JdonMVC+Jdon来演示一下domain event或者说cqrs,或者说非贫血模型。
也许是非常不严谨的实践,以后还会更新,大家可以了解其中的思想,整个代码可以到http://code.google.com/p/jdonmvc/downloads/list下载,war包直接放到tomcat里就可以跑,程序运行界面如下:
下面上代码解释:这是User类,没有写get set到这里,get ,set尽量只在UI和DB层用,因为那是OO世界的过程化边界,jivejdon用get来在UI层做全局懒加载。
@Model public class User { private int userId; private String name; @Inject private DomainEvents domainEvents; //jdon对Model的enhance对象,隔离domain和技术的耦合 //记忆 public void remember() { domainEvents.saveDomainObject(this); } //状态变化,domain对象In Memory管理 public void updateMemory(){ domainEvents.domainHasBeenEdit(this); } //失忆 public void forget(){ domainEvents.domainHasBeenDelete(this); } }
|
无状态服务类UserService
public interface UserService { User enhance(User user);//借用jdon的领域事件模式,enhance领域对象
}
|
CQRS中的命令上下文
@Resource public class UserCommandContext {
@Service("userService") private UserService userService; @Path("/users") @Post public String create(User user) { User usermodel = userService.enhance(user); usermodel.remember(); //记忆 return "redirect:/"; }
@Path("/user/{<[0-9]+>user.userId}") @Delete public String delete(User user) { User usermodel = userService.enhance(user); usermodel.forget();//失忆 return "redirect:/"; }
@Path("/user") @Put public String update(User user) { User usermodel = userService.enhance(user); usermodel.updateMemory();//状态更新 return "redirect:/"; }
}
|
这是CQRS中的查询路径,UserQueryService直达DB
@Resource public class UserQueryResource { @Service("userQueryService") private UserQueryService userQueryService;
@Path("/") public Represent index(Page<User> page) { Page<User> pagedata; if (page == null) pagedata = userQueryService.getUserList(new Page<User>()); else pagedata = userQueryService.getUserList(page);
CssPageBar cssPageBar = userQueryService.getCssPageBar(pagedata);
Map<String, Object> map = new HashMap<String, Object>(); map.put("page", pagedata); map.put("cssPageBar", cssPageBar); return new Html("/index.ctl", map); } @Path("/user/{<[0-9]+>userId}") public Represent user(Integer userId) { User user = userQueryService.getUser(userId); return new Html("/user.ctl", "user", user); }
}
|
[该贴被oojdon于2010-07-13 14:59修改过]
[该贴被oojdon于2010-07-13 15:04修改过]
[该贴被oojdon于2010-07-13 17:52修改过]