缘起

最近阅读<> (刘金亮, 2021.1)
本系列笔记拟采用golang练习之

聚合模式

  1. DDD中有两个非常重要的模式:聚合(Aggregate)和聚合根(AggregateRoot)。
  2. 聚合是对概念上属于同一实体(entity)或值对象(value object)的封装。
  3. 而聚合根的含义是指,任何对该聚合的访问都仅到达聚合根。
  4. 比如Car就是聚合根,虽然Car有轮胎、车灯,
  5. 但是显然外部访问都只需要访问Car,聚合根确保了聚合的完整性。
  6. 聚合的规则
  7. 1. 只有聚合根可被外部访问
  8. 2. 聚合之间的联系通过主键编码而不是引用
  9. 3. 单个事务只能创建或更新一个聚

目标

  • 设计符合聚合原则的订单服务

IOrder.go

订单接口

  1. package order
  2. type IOrder interface {
  3. GetOrderID() int
  4. GetConsumerID() int
  5. GetItems() []IOrderItem
  6. AddItem(item IOrderItem) error
  7. RemoveItem(itemID int) error
  8. GetStatus() int
  9. UpdateStatus(oldStatus int, newStatus int) error
  10. }

IOrderItem.go

订单的明细, 包含商品ID和数量, 价格等信息

  1. package order
  2. type IOrderItem interface {
  3. GetItemID() int
  4. GetSkuID() int
  5. GetQty() int
  6. GetPrice() float64
  7. }

IOrderService

订单服务接口, 定义订单的创建/获取等方法

  1. package order
  2. type IOrderService interface {
  3. Create(it *OrderData) IOrder
  4. Get(orderId int) IOrder
  5. }

OrderData.go

订单数据的值对象, 用于创建订单.

  1. package order
  2. type OrderData struct {
  3. OrderID int
  4. ConsumerID int
  5. Items []*OrderItemData
  6. }

OrderItemData.go

订单明细数据的值对象, 用于创建订单

  1. package order
  2. type OrderItemData struct {
  3. ItemID int
  4. SkuID int
  5. Qty int
  6. Price float64
  7. }

(未完待续)