求教!电商系统,商品上下文中的领域模型设计

18-12-07 restlife221
    

各位好,我现在正在开发一个电商项目,目前还是使用的事务脚本形式,最近也在接触DDD,这几天一直在思考商品上下文中领域模型的设计,有几点问题想请教大家, 先描述一下业务场景:

1. 商品分为统一规格和多规格, 统一规格用户无需选择商品规格,直接输入售价、库存(目前库存只是作为sku的一个属性)等属性,多规格需要用户选择规格,然后根据所选规格再生成sku

2. 商品也分为虚拟和实物商品, 这两个类型商品会个别字段不相同,比如虚拟商品有A、B、C字段,而实物只有A、B, 验证规则也不尽相同

3. 同时也有一个套餐管理模块, 套餐只比普通商品,多一个关联属性, 关联的是商品的spu

4. 目前系统中存在一个规格管理模块

5. 商品类别目前没有单独模块维护, 是系统初始化的数据..

6. 产品那边有一个需求是, 可以在spu列表上直接修改sku的库存和价格

我一开始想的是spu作为聚合, 其中有spu规格实体(这个规格主要的目的就是记录当时用户选择的规格, 目前是修改规格名称时也会级联更新商品关联的规格)、List<Sku>实体(sku实体也有规格实体)、类别值对象, 大致上是这样划分的。问题如下:

1. 按照我的理解: 聚合内部要保持强一致性,生命周期相同。 那规格 是不是需要建模成聚合, spu聚合持有的是 规格聚合的id, 因为规格和商品的生命周期不同

2. 按照我的理解: 聚合内部的数据只能通过聚合根来更改。 那在列表上修改sku的库存和售价的时候,只能通过spu这个聚合来更改。 是不是有必要把sku也单独拆分出来成为一个sku聚合, 这个sku聚合目前可以放在商品上下文中, 未来如果有库存上下文的话, 甚至可以把sku放到库存上下文中。但是如果拆分成两个聚合的话 ,比如添加、修改商品的时候会操作两个聚合(我看了其他文章,有看到这种多聚合操作可以通过领域事件来解决,但我刚接触DDD,想从比较基础的部分起步,尝试小步、逐渐迭代的方式来重构系统:( )

3. 套餐和商品的模型我一直没有太好的想法..

以上就是我的问题, 希望大家多多指教!先在此感谢!!

    

1
banq
2018-12-07 10:51

DDD中有一个规格模式,specificatiin模式,只要实现约束规则,包括业务规则等。规格一般是一个值对象,附加在聚合根里面。

你的需求关键还是上下文和聚合根还没有找对,sku与spu这样的业务术语没有统一定义。

步骤: 统一语言 上下文和聚合根。

脱离上下文的聚合根就变成通用模型,这不是我们的目标,不要设计上帝式的统一模型,可以统一语言,但是不能统一模型,只能映射模型。

假设一下下面思考,不知符合你需求: 

商品肯定是一个上下文,关键是sku与spu是否是一个独立上下文,其实这两者都是特征性质描述,习惯上都属于值对象范畴,是否有必要设计为实体甚至聚合根,还要看你是否需要对特征分类进行唯一标识,比如将某个特征分配给某个商品?如果需要,这是两个上下文,商品和特征分类。

两个上下文只要包含对方唯一标识,将标识ID作为值对象的值。

restlife221
2018-12-07 17:32

非常感谢您的回复。 

我之前的方法感觉像是更偏向战术设计了, 忽略了战略, 似乎本末倒置了。 对于您提到的一些概念也比较模糊。 还是需要加强学习和思考..