对JEEApp分层的浅知和ROR下DomainModel的质疑
基于目前的认知,我大概清楚目前JEE App里的架构分层大概如下:
view-->controller-->service-->dao-->entity
1.controller层
(1)职责:负责协调view层与service层,具体而言就是获取、过滤view层的输入,调用相应的service逻辑处理并根据其返回结果选择不同的view进行显示。
(2)依赖性:向下依赖service,向上依赖容器或框架
2.service层
(1)职责:负责向controller提供业务逻辑处理接口,事务安全的调用dao层完成业务逻辑处理。
(2)依赖:组合或继承dao(下面会解释)或向下依赖dao,向上依赖容器或框架。
3.dao层
(1)职责:负责对应实体的持久化工作,包括CRUD等。
(2)依赖:向下依赖PO或entity,向上依赖容器或框架
上面说到service会组合或继承dao,我相信有人会觉得疑惑或质疑。我以我个人的认知来谈谈这个问题。首先,我们不能排除那些微型的基于数据库CRUD的JEEApp的存在,实际上留言板、BBS等都具有该特点,在这种系统中,service层对controller提供的业务逻辑接口至少会有CRUD方法吧?而且是“纯粹”的CRUD,例如添加一条留言,这个行为无论对于service还是dao来说,都是一样的,其方法签名甚至连名字都可以一样,那么,我们是否可以让service具有CRUD的能力呢?不仅如此,我们是否应该无需手动编写任何的CRUD代码呢?(因为这些代码完全可以让反射帮你搞定)。那么,service层到底应该手动编写什么代码呢?从上面说到的职责来看,有两个理由,一个是具有事务性,一个是复杂性,这里说的复杂性是对于超过单个dao方法能力而言。例如前面谈到的添加一条留言,如果添加留言需要某些前置条件,例如保证添加者是登陆状态的,那么这时候dao的create方法就没办法满足要求了,这时候service的create和dao的create方法处理逻辑完全不同,因此需要手动编写service的create方法了,也许编写如下:
public String create(Message message){ return this.dao.create(message);}