1. 看到你的项目用到了 DDD,这也是我们很感兴趣的技术点,你可以介绍下你在使用 DDD 做这个项目时,都运用了 DDD 哪些知识。
DDD 是一种软件设计方法,软件设计方法涵盖了范式(标准)、模型、框架、方法论等内容,而 DDD 的很多规范约定,都是为了提高工程交付质量。如几个很重要的知识点;框架分层结构(应用层,领域层,基础层,触发层)、领域、实体、聚合、值,po对象、依赖倒置等。它所有的手段,都希望以一个功能逻辑的实现为聚合,将功能所需的对象、接口、逻辑,按照领域划分到自己的领域内。
就像在这个项目中,我负责实现的抽奖中的策略,就是一个独立的领域模型。在这个领域中我需要提供策略的装载、随机数算法计算、抽奖模板调用(含责任链和规则树)功能,这样一个领域就像划分好的一个独立个体,它拥有属于它的对象信息(实体、值对象、聚合),当需要使用数据库资源、缓存资源,以及外部接口资源的时候,都通过依赖倒置进行调用。也就是说,我的领域不做其他模块的引入,而是领域只负责业务功能实现,所需的所有数据,则有外部接口通过依赖倒置提供。更多理论知识
2. 你的抽奖流程中,哪些被定义为po, 值对象,哪些被定义为实体、聚合对象
po 数据持久对象,与数据库字段保持一致
在 DDD 的规范定义中,值对象通常用于描述对象属性的值,不具备唯一ID,不影响数据变化。是一个属性对象。。而那些实体对象,则具备唯一ID,会影响到最后的写库动作。如;抽奖发起实体、奖品信息实体对象。并且我们可以把一些和实体对象相关的功能聚合到对象内,这样的通用性会更好(也叫充血模型),避免所有调用方都需要自己编写逻辑。如:StrategyEntity,对ruleModel根据逗号进行拆分
聚合对象 两个对象聚合成新对象,或一个对象加另一个对象部分属性
聚合根 通常就是定义的聚合对象。如果有单独的userid、xxxNo、uuid 等可以提出一个聚合根id
3. 关于访问数据层的依赖倒置是什么,是怎么使用的,有什么好处,你可以描述下吗
正常情况下,我们要根据基础层有什么服务来搭建领域层,而依赖倒置是,我领域层需要什么,就定义一个接口,让外部服务实现它
DDD 中的依赖倒置是一个非常好的设计 1. 领域层不再关心基础层,有利于领域层专注于开发自己的业务
2.尤其是与 MVC 结构对比的时候,MVC 的贫血模型结构设计,数据库持久化对象,很容易被当做业务对象使用,这样后期非常难维护。但在 DDD 的分层结构用,是以 domain 领域实现为核心,一个 domain 领域下所需的外部服务,定义外部接口,让基础层做具体实现。而数据库持久化操作 ,定义的 PO 对象,就被这样的方式被限定在基础层了,外部是没法引入使用的,也就天然的防止了数据库持久化对象进入业务中。