领域驱动设计

存储过程 vs 表视图 vs 领域驱动

organizing-domain-logic-patterns-l.jpg
  • 存储过程
    • 面向集合
    • sql/存储过程编辑表
    • 指数级复杂度
  • 表视图
    • 面向过程
    • 代码编辑表
    • 指数级复杂度
  • 领域驱动
    • 面向对象
    • 代码编辑领域模型
    • 领域模型同步到表
    • 线性复杂度

六边形架构(以领域模型为核心)

db_vs_domain.png
  • 领域模型外都是适配层(包括数据库)


    100-explicit-architecture-svg.png

VO-BO-DO 是领域驱动的实现方式,其中BO是核心领域模型,VO和DO都是适配

聚合根/实体/值对象

OrderBO(聚合根)

  • orderId(值)
  • BaseInfo(值对象)
    • orderStatus(值)
    • orderTime(值)
  • TradeInfo(实体)
    • payId(值)
    • amount(值)
    • payStatus(值)
  • LocationInfo(值对象)
    • country(值)
    • address(值)
    • district(值)
  • OrderGoods(实体)
    • orderGoodsId(值)
    • GoodsAttribute[] (值对象)
      • size(值)
      • style(值)
    • sku (值)

============================
OrderDO

  • orderId
  • orderStatus
  • orderTime
  • country
  • address
  • district

TradeDO

  • payId
  • amount
  • payStatus

OrderGoodsDO

  • orderGoodsId
  • goodsAttributes(json)
  • sku

============================
OrderVO

  • orderId
  • orderStatusDiscription(orderStatus的说明)
  • orderTimeFormat(yyyy-MM-dd HH:mm:ss)
  • amountWithUnit(把钱转为国家对应的货币单位和分割方式)
  • payStatusDiscription
  • location(country + address + district)
  • goodsAttrWithLanguage[] (经过翻译以后的GoodsAttribute)
  • sku

如何设计领域服务(用例法,读写分离)

  • OrderService(领域服务)

    • submit(OrderBO)
    • confirm(orderId)
    • cancel(orderId)
    • pay(orderId, amount)
    • changeGoods(orderId, goodsInfo)
    • changeLocation(LocationInfo newlocation)
  • OrderQueryService(复杂查询,或者直接调用DAO)

    • queryPageByConditions(conditions)
    • specialReport(conditions)

你可能感兴趣的:(领域驱动设计)