请教banq,想再新项目使用DDD, 可是思路不是很清晰

学了有两周的理论了, 网上也看了不少经验贴 包括ITEYE 与 INFOQ的
不过大部分例子我个人觉得 都只是包结构和 类的定义层级 与传统贫血模式的区别

用白话说我的理解
从思想上我觉得DDD是希望 把业务 形成细粒度的 模型 ,模型里包含的是业务的具体属性和动作,好处是业务可以直观体现在模型内, 而细粒度的业务变化较少, 一般都是聚合性的业务 也就是业务组合 变化会比较多 这样把最细的业务动作放在模型内 重用性会很高。

不知道这个概念我理解的对不对?

但是如果一个新的项目,包的层级一定要按某个案例那样划分吗 比如service 还有reponsitry什么的,而且具体reponsitry与DAO的区别 在网上不断有争论 却没有权威的定义。reponsitry到底是个啥?

如果领域模型包含了所需的业务方法, 那就需要实际地调用, 在实例化领域模型前是否也需要依赖注入进行解耦合, 是否需要实现某接口?

如果非多个领域模型业务动作的组合,就不需要service直接调用, 那调用者又是谁 ,比如使用MVC框架, 是否由action等控制器来调用呢。 还是需要在外面包一层BO类?

由于具有业务属性, 领域模型是否可以做值对象来传输?

其实这种思想如果从根本打通, 可能一切问题都不是问题了, 请@banq 帮我解惑 , 我一定会在新项目中实施DDD, 并且将经验教训在这里与大家分享

[该贴被zouruixin于2012-12-14 11:36修改过]

2012-12-14 11:30 "@zouruixin"的内容
如果领域模型包含了所需的业务方法, 那就需要实际地调用, 在实例化领域模型前是否也需要依赖注入进行解耦合, 是否需要实现某接口? ...

其实你的这些疑惑只是表面,不是很重要,原因是视角不同,使用DDD需要重新改变思维习惯,你的这些问题如果换一个视角考虑也许就不是问题,建议读一下:DDD案例:足球比赛

领域模型包含了方法,这个领域模型是聚合根实体,其业务方法是为了保护或跟随其内部状态,这些行为可以暴露给外界调用,就无需实现接口和注入,使用事件替代接口。

关于业务过程在哪里调用的问题:
多个聚合根实体的业务方法组成了业务过程,这个业务过程的调用者要根据读写不同分别调用,普通用户只是查询,可以通过Action直接查询view model,而写操作是服务于领域专家,那么提供服务给客户端调用也是可以。这些都是形式问题,关键是读写分离,CQRS。

关于领域模型是否被作为值对象传输的问题:
领域模型包括实体和值对象,是值对象的父集,因为领域模型分为可变状态和不可变(值对象)之分,不能把领域模型统一作为值对象,而且不是领域模型被传输,而是领域模型发出命令,命令去传输,这才是改变我们过去将领域模型作为数据,造成一种被奸的局面。

当以领域模型为王,而不是以数据为王以后,Repository仓储的意思就很明显,仓储是收起来保存的意思,这与Hibernate的冬眠意思一样,是什么冬眠或被保存收起来呢?当然是领域模型这个对象。

希望能够帮助你。
[该贴被banq于2012-12-14 16:19修改过]