初学DDD,请求指导

初学DDD,下面一些是我的理解,不知是否正确,恳请banq及各位高手指导。

值对象是一种能够代表具体意义的数据集合,在领域模型中,我们没有必要使用一种标识去区分值对象个体。值对象需要依托实体而存在。在《领域驱动设计精简版》一书中,将绘图程序中画布上的某个点的坐标视为值对象我觉得不太合理,因为绘图程序中我们的确关心的是点,而坐标恰好可以作为点的一个标识;我觉得点的颜色RGB三元组倒是可以用值对象来处理。

对于服务,可以分为领域服务和应用服务。领域服务主要在领域层,它可以为实体提供业务逻辑服务,比如在处理客户信用额度时候,可以将信用额度判定逻辑作为一种服务而应用于客户实体;至于应用服务,或许更多地关注技术层面上。领域服务就像是建立在业务逻辑层面的一种“基础设施(infrastructure)”,它能为领域逻辑处理提供服务接口。

对于仓储(Reponsitory),它的职责包括了实体持久化、对象检索、筛选,它直接与底层的基础结构(比如数据持久化机制)交互,是一种实体对象状态维护与查询的机制。

在DDD中,工厂负责对象的创建,关注对象的创建方式;仓储(Reponsitory)关注已创建对象的状态、持久化以及筛选查询。由于仓储具有组织已创建对象的能力,因此从应用层面上看,仓储仍然像个能够生成新对象的“工厂”。

不知我的这些理解是否偏离了DDD的本意,其实很多东西的确需要通过实践才能深刻认识到。我最近在.NET下专研DDD思想,并希望能够在.NET下实践DDD。虽说思想抽象于语言,但语言的本质特性也的确会影响到设计思想的变更。

希望banq大哥以及各位同仁能够多多指教!

你的理解基本正确,但是实践中很难在实体和服务之间做抉择,会将很多功能放入服务中,从而可能形成贫血模型,业务重点不应该在服务中。

>将绘图程序中画布上的某个点的坐标视为值对象我觉得不太合理

这个取决于其他场景,如果点是一个实体,坐标作为定义点的位置的一个值(包含XY坐标值),那么坐标设计为值对象是允许的。

DDD非常强调实事求是,就事论事,没有抽象的规律和准则,所以,也不可能用一个数学公式表达所有业务需求,这就是OO思维的本质;

感谢banq指导!我会继续思考DDD相关的理论与其实践过程。谢谢!