JdonMVC+JDON+CQRS演绎智能对象

10-07-13 oojdon
阅读本贴之前请先阅读如下几个帖子

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修改过]

              

5
oojdon
2010-07-13 17:52
axonframework是一个cqrs框架

http://code.google.com/p/axonframework/

它的Domain代码如下,大家可以做个对比

class Contact extends AbstractAnnotatedAggregateRoot {

    public Contact(String name) {
        apply(new ContactCreatedEvent(name));//domain存在了发一个create事件
    }

    public void registerAddress(AddressType type, Address address) {
        if (addresses.containsKey(type)) {
            apply(new AddressChangedEvent(type, address));
        } else {
            apply(new AddressAddedEvent(type, address));
        }
    }

    public void removeAddress(AddressType type) {
        if (addresses.remove(type) != null) {
            apply(new AddressRemovedEvent(type));
        }
    }

    public void changeName(String name) {
        apply(new ContactNameChangedEvent(name));//更新
    }

    public void delete() {
        apply(new ContactDeletedEvent());//删除
    }
<p>

cuwkuhaihong
2010-07-14 07:57
不错,有空杯心态和很强的实践能力。先读读你的代码,再做评论。

banq
2010-07-14 19:15
真不错,不过我头也有点晕,要仔细研究一下,oojdon深入能力很强。

现在外面招聘人才,就像高考一样,要求面面俱到,结果,招到的人往往什么都知道,什么都做不了,无法深入。

cuwkuhaihong
2010-07-14 23:53
我看的也有点晕,所以产生了一个问题,为什么如此简单的功能在使用两个框架的基础上还写了那么多代码呢?

[该贴被cuwkuhaihong于2010-07-14 23:54修改过]

猜你喜欢
3Go 1 2 3 下一页