首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络基础 >

血枯病的Domain Model

2012-11-10 
贫血的Domain Model好老的话题啦。拿出来炒炒冷饭。各位见谅。——————————————————————Domain Model贫血是说属

贫血的Domain Model
好老的话题啦。拿出来炒炒冷饭。各位见谅。
——————————————————————
Domain Model贫血是说属于Domain Model的逻辑没有放在Domain Model中。那是哪些逻辑没有放到Domain Model中,从而导致贫血一说呢?原因有很多,但是我认为最主要是Service中的那些逻辑。而这些逻辑又有一个共同的特点就是依赖于DAO,或者说需要查询数据库。Robbin的帖子:http://www.iteye.com/topic/57075,举了一个很好的例子。我取其中的一个部分在这里做演示用。



通过指定RichEntityTuplizer,我们可以控制Hibernate的动态增强过程。

 大家的做法不某而和,呵呵。

如果做过多Client的WebServer项目的话就不会有太多疑问了。
这种项目中,web层本身只不过是众多client中的一个而已,另外还有GUI的 或 独立进程(用于系统间通信)的client,这些client并不能直接使用webserver里面的DomainObject,必须要一个Service/action层作agent,其实service层也可以发展成应用/界面逻辑(顺便控制事务边界),而Domain中是真正的领域相关的业务逻辑。 大家的做法不某而和,呵呵。

如果做过多Client的WebServer项目的话就不会有太多疑问了。
这种项目中,web层本身只不过是众多client中的一个而已,另外还有GUI的 或 独立进程(用于系统间通信)的client,这些client并不能直接使用webserver里面的DomainObject,必须要一个Service/action层作agent,其实service层也可以发展成应用/界面逻辑(顺便控制事务边界),而Domain中是真正的领域相关的业务逻辑。

先不说你多client的项目是多么的罕见,就算你有GUI的独立client,你用什么方式和Server通信?说到底无非就是两种:

1、RMI方式
EJB就是基于RMI方式,但我相信你不会采用RMI方式,RMI不但复杂而且有太多限制,现在这种方式已经基本不被采用了

2、Web Service方式
好吧,Web Service方式你是不是还是需要Server端有一个Web层?

所以不管你是不是多个client? Server端必然都是通过Web层提供服务的,所不同的只不过是client是浏览器、手机、或者应用程序而已。所以Service层真的是必要的吗?恐怕未必吧。

你就看Rails的REST,人家只有Web层,那有怎样? 看看twitter吧,浏览器访问、手机访问、桌面软件访问、插件访问,其他网站API访问,消息访问,这client够多了吧,可是Rails需要什么Service层,什么agent层吗?


大家的做法不某而和,呵呵。

如果做过多Client的WebServer项目的话就不会有太多疑问了。
这种项目中,web层本身只不过是众多client中的一个而已,另外还有GUI的 或 独立进程(用于系统间通信)的client,这些client并不能直接使用webserver里面的DomainObject,必须要一个Service/action层作agent,其实service层也可以发展成应用/界面逻辑(顺便控制事务边界),而Domain中是真正的领域相关的业务逻辑。

先不说你多client的项目是多么的罕见,就算你有GUI的独立client,你用什么方式和Server通信?说到底无非就是两种:

1、RMI方式
EJB就是基于RMI方式,但我相信你不会采用RMI方式,RMI不但复杂而且有太多限制,现在这种方式已经基本不被采用了

2、Web Service方式
好吧,Web Service方式你是不是还是需要Server端有一个Web层?

所以不管你是不是多个client? Server端必然都是通过Web层提供服务的,所不同的只不过是client是浏览器、手机、或者应用程序而已。所以Service层真的是必要的吗?恐怕未必吧。

你就看Rails的REST,人家只有Web层,那有怎样? 看看twitter吧,浏览器访问、手机访问、桌面软件访问、插件访问,其他网站API访问,消息访问,这client够多了吧,可是Rails需要什么Service层,什么agent层吗?




您还真说对了,实际中就是用的RMI,还就因为这个使用了SLSB(当然web可以走近道local)。
04年的项目了,现在要赶时髦当然可以换成HttpInvoker、Hessian、Buriap、甚至JSON......
不过慢着, 如果当时将应用逻辑混合到了SLSB里面(而没有将其分离到独立的service层,这个就和你认同的将逻辑写到web的action里面一样),哦,我的天,恐怕这事儿还真麻烦了......

另:
我相信没人真的喜欢webservice,
不过即使是使用webservice,webservice也只是一个adapter而已(不含任何业务),同样SLSB也只是提供RMI的adaper,这些adapter都只是技术相关的,他们本身不能算作一个层,但他们却都需要使用service层来完成动作。

从ROR看REST的神奇之处在于,他将REST(系统间的接口)和正常的Web应用(人机接口)较完美的和谐成一套代码了。再加上ROR本来就没有分层,只有MVC。而JEE是强调分层,然后再在Web层使用MVC。在Rails里面别说找什么Service层,agent层,你连表现层,逻辑层,持久层都找不到。。。差异太大,先别参考了。

twitter我是实在不了解,抱歉了。



public class Employee { @OneToMany private Set<Task> tasks = new HashSet<Task>(); public Set<Task> getProcessingTask() { ...... } public static getAllEmployee() { ...... }}


比方说类似这样的,如果不依赖特定对象实例的方法,直接用静态方法如何?如果getProcessingTask用到其他对象的方法,如果是依赖对象状态,可能就是方法参数传递进去,如果不依赖,直接调用该对象静态方法。

不知道这样去用,会不会有什么问题。自从IoC兴起以后,貌似就没有人这样去用了,大家都极力避免静态方法的出现。




我昨天也在思考这个问题,如果是静态方法,可以很大程度上减轻对象的行为,因为像GetXX这些方法我认为与具体的实例相关增加了领域对象的复杂程度,领域对应该最好只是专注与自身的状态.但是Ioc的动态注入实在是个好东西,真是不知道如何取舍好.

热点排行