我想在实际系统中,crud并不是crud,而是映射到具体的业务动作上,所以应该在service之类的对象里
但在很多很优秀的开源软件里,确实crud是放到了domain中,我理解他把domain视为service,不知道这样理解对不对
这样说来只是不同人观察角度不同而已
[该贴被vcshcn于2009-02-24 16:49修改过]
各有所好吧.如果你的model类有很多,且大多业务都是crud,而你又不想让service层太臃肿了,那就到model中吧,虽然这样看上去怪怪的.但是有一点请记住别让domain层依赖于任何工具,比如spring.
能详细说下DDD的概念吗?
我觉得,如果把crud放入到domain中,那么crud方法应该是private的,不会是public,这样在domain的业务方法内部自行调用crud,达到隐藏持久化的目的,可能这样更oo一些
不论放在哪边,主要看我们是为了达到什么效果。
能否从“满足不断变化的需求”方面进行对比,看哪个更易于维护。
例如订单中途撤销类似新需求。
学习了。
而Java在这方面做得和ror等就不一样,它没办法这么做,要做的话,在视觉上就有显式的dao,于是一旦看到dao,我就知道原来它在那里。当然也可能会利用特别的编译器在编译期生成dao,从而在视觉代码上看不到dao,但实际在编译后还是有dao,但那都不需要人为管理了。
[该贴被freebox于2009-02-09 13:41修改过]
赞同你这种说法,领域实体无法自我创建,所以创建方法不能是实例方法,只能是类方法。当需要创建领域实体时,由领域实体类向领域场景发出消息事件,由领域场景触发相应的适配监听器调用领域服务完成持久化操作。在此还涉及到了实体UID的生成问题,实体存活在领域场景中,其UID不是在持久化场景中生成,应当由领域场景给予,显得更合理。
楼上说得很好,已经深刻掌握领域模型和技术架构分离的关系。
能否这样,Domain里面的业务方法都主要产生业务事件,这些事件产生后都由Application的监听器接收后判断使用Application的那种或哪些Service来完成。Application的Service如果需要做持久化操作,就注入Repository或者DAO进行持久化。
比如注册业务:
User要做的就是填好自身资料,提交注册请求,转化成代码就是给自己的属性赋好值,然后触发“注册”事件。
系统要做的是对User的注册事件提供服务,所以Application的某个Service提供了“注册”的服务方法,来处理User的这个事件。这个Service如果认为需要将User的信息持久化,以免丢失,就调用持久层进行辅助操作。
UI层就直接调用User Domain里面触发注册事件的方法。
这样Domain不是贫血的,各层又各施其责了。
以上是我的一点想法,如有误,请各位大侠不吝斧正。
我觉得CRUD不应该是业务操作,所以讨论CRUD到底是放到Service层还是Domain层的意义不大。试想一下,将来的云计算发展到一定程度,我们不再使用自己的数据库来持久化对象,而是直接扔到云里,对象关系映射这一过程直接对我们透明,反正进去出来都是对象,对象在我们的系统中履行其职责或改变自己的状态。。。。
创建行为如果有较丰富业务意义,以放入domain模型为好,被创建出的对象只有在domain context中才易于交互。
最简单的方式,static 方法。
CRUD放在Domain中, 那不是ActiveRecord么?