阅读本贴之前请先阅读如下几个帖子
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);
}
}
<p>
|
无状态服务类UserService
public interface UserService {
User enhance(User user);//借用jdon的领域事件模式,enhance领域对象
}
<p>
|
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:/";
}
}
<p>
|
这是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);
}
}
<p>
|
[该贴被oojdon于2010-07-13 14:59修改过]
[该贴被oojdon于2010-07-13 15:04修改过]
[该贴被oojdon于2010-07-13 17:52修改过]