是否可以在模型中有这么一个方法
@Transient
public String getSexLang() {
return sex = 1 ? "先生" : "女士";
}
注:在标签层,我这么输出 ${item.sexLang}
性别是一个枚举。而现在的需求是能输出中文名称。
这样的方法能否放在模型中,能否做为一个业务方法存在呢。
这个判断过程我不想放在表现层,因为可能有多个页面需要判断,如果都写死,那么改的时候要到处找。
[该贴被fnet于2011-03-20 16:31修改过]
@Transient
public String getSexLang() {
return sex = 1 ? "先生" : "女士";
}
注:在标签层,我这么输出 ${item.sexLang}
性别是一个枚举。而现在的需求是能输出中文名称。
这样的方法能否放在模型中,能否做为一个业务方法存在呢。
这个判断过程我不想放在表现层,因为可能有多个页面需要判断,如果都写死,那么改的时候要到处找。
[该贴被fnet于2011-03-20 16:31修改过]
按严格要求,模型中的确不应该出现这种方法。
1. 此方法没有业务含义
2. banq说的国际化原因
我想这个应该放到界面上去用国际化方式输出。
再次感谢。
不一定非要转移到界面层,有的也不能转移,只能由模型指挥一些专门组件比如Pretty时间库http://www.jdon.com/jivejdon/thread/40047。
这个组件是用来根据当前时间和数据修改时间差值,判断输出“XXX分钟前”或“XX分钟后”这样输出,是由业务模型驱动的。这个组件被我用在jivejdon上,如果一小时内有人发帖,就在全站发出通知“XX分钟前谁发了新帖”,这个页面显示内容都是在领域模型驱动下完成,但是代码中没有hardcode硬编码任何中文信息。
可下载jivejdon 4.2看看,主要模型在com.jdon.jivejdon.model.notification中。
http://sourceforge.net/projects/jdon/files/jivejdon/4.x/
还有一个问题想请教。
对于校验,以前用struts时,我们都是用FormBean校验,或者Common-Validator配置文件的方式。
我们现在将校验放在模型里,使用Hibernate Validator的方式。
校验至少分为以下几种:
客户端输入校验,主要是js,html限制长度。
服务器端输入校验,同客户端输入校验。一般放在controller层
业务数据校验,涉及业务方面,可能与持久层交互。一般放在controller层或service层。
客户端校验不用说。
服务器端校验,我们现在主要使用Hibernate validator方式。
业务数据校验,我们有没有必要放在模型中。还是与模型独立开。
我觉得既然我们发起一个业务操作是针对业务模型。那么是否可以理解为,模型可以自己完成校验过程。
说的不是很清晰,请您见谅。请您多多指教,非常感谢。
public boolean validateAreaid(WebErrors errors
, AreaManager areaManager, Long areaid) {
if (areaid == null) {
errors.addErrorString("地区不能为空");
return false;
}
Area area = areaManager.get(Area.class, areaid);
if (area == null) {
errors.addErrorString("地区不存在");
return false;
}
return true;
}
象你举例的几个都是逐项校验,不涉及太多业务检查,可放到表现层如formBean中,如果你把Hibernate的模型看成是领域模型,也没有必要放在领域模型,如果你把Hibernate的模型看成是持久层校验,放入其中倒是可以的。
反正,必须搞清楚我们说的DDD领域模型虽然可以用Hibernate的对象模型暂时替代,但是不会很优雅,在我的JiveJdon中,这两者是分离的,领域模型纯粹生存在内存中In-memeory,否则,两者混在一起,领域模型内部设计包括方法都要考虑到Hibernate持久化,造成技术限制业务,这和数据库技术限制业务就没太大区别,50步和100步的区别而已。
业务应该凌驾技术至上,技术不应该限制业务,这是原则。公仆不能凌驾于主人之上,只有在人类社会才可能颠倒过来,这技术世界千万别将错就错了。