JdonMVC+JDON+CQRS演繹智慧物件

oojdon發表於2010-07-13
閱讀本貼之前請先閱讀如下幾個帖子

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裡就可以跑,程式執行介面如下:

[img index=1]
下面上程式碼解釋:

這是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 class="indent">


無狀態服務類UserService

public interface UserService {
			
	User enhance(User user);//借用jdon的領域事件模式,enhance領域物件 	

}
<p class="indent">


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 class="indent">


這是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 class="indent">





[該貼被oojdon於2010-07-13 14:59修改過]

[該貼被oojdon於2010-07-13 15:04修改過]

[該貼被oojdon於2010-07-13 17:52修改過]

相關文章