面向DDD的开源框架javAte


主页连接:http://www.javate.amattioli.it/mainsite/description.html

一个好的设计思路如果能有一个好的架构支持将更加游刃有余,这是我所知道的第一个真正迎合DDD思路而设计的架构

我昨天也看到了,可以基于它开发基于ZK(AJAX框架) + Hibernate架构应用软件,它将DDD的一些Entity和Specification等形成专门的类,用来继承,我正在研究学习它的这些类。

以前,我也曾经想在Jdon框架中具体化一些DDD名词类,但是感觉只是形式上的,因为DDD是一种设计风格,很难从框架上去强制,不过肯定有人在探索,javATE至少是一个。Qi4j也是一个探索,它是从打碎类的概念去强制,也值得学习。

SVN Checkout JavAte框架自身源码:https://javate.svn.sourceforge.net/svnroot/javate

下载使用JavATE开发的应用案例(ZK + Hibernate):

http://javate.svn.sourceforge.net/viewvc/javate/example1/tags/example1-0.2.tar.gz?view=tar

[该贴被banq于2009-09-24 14:56修改过]

javAte对Domain Events处理也是非常好的,比较完善。
Domain Events – 救世主

每个实体都必须继承一个抽象类EntityImpl,在EntityImpl同时是监听者观察者PropertyChangeEmitter的实现,PropertyChangeEmitter主要是监听Domain 实体的事件Event,是Domain Events模式的一种实现。

当然,让每个实体继承一个类,这个做法以前Jdon框架也曾经做过(继承Model),被认为非POJO,如果javAte能够以元注解Annotation来替代继承,或者参考Qi4J那样使用Mixin这些技术可能会更好,但是性能损害就会很大,真是两难选择啊。

Javate在Domain Event上做了不少工作,实现了同步的Command模式,如Command接口代码:


public interface Command extends PropertyChangeEmitter {

public void doCommand() throws ApplicationException;

public void cancelCommand();

public void validate() throws ApplicationException;

public void addCommandListener(CommandListener listener);

public void addCommandListener(CommandListener listener, CommandResult... results);

}

还专门实现了事务的Command,以前在看SUN公司的Jpetstore时,其EJB调用也实现事务Command,不过它是以EJB调用为主,而我们应该将模式重点用在业务领域Domain Model上(可见SUN公司将简单事情复杂化,然后进行错误引导的功力很深啊。上过一次当不再上当,可很多初学者还是被SUN误导,虽然其倒闭被收购,所以,不能单技术谈技术,没有抓住业务重点。)

事务Command是借助CGlib的动态代理拦截实现,对领域模型实现拦截,这是非常异同于Spring等框架之处,我目前在正在研究将这一功能导入Jdon框架,所以才有几个动态代理Proxy工具性能比较一文,测试下来,CGlib最快,Javate也是用CGlib,研究到这里,有点泄气,感觉Javate已经做了自己想做了,而且做得非常全面,我理想架构是AJAX + RESTFul + Domain Model,Javate基本做到了。

javAte借助Domain Events实现Domain Model和客户端Ajax界面模型的同步,这是一种变相的分布式MVC模式,因为Model在服务器端,View在客户端,这种方式非常类似Swing中界面模型监听模式,由此可见,Swing客户端要和服务器端DOmain Model同步,这中间也需要Domain Events做中间传递者。


javAte主要借助JDK的PropertyChangeListener来实现Domain Model事件触发,javAte不少工作花费在将Domain Model和ZK的界面模型同步上,而没有象Qi4j那样专门执着于Domain Model上。有些可惜。


[该贴被admin于2009-10-17 09:50修改过]