在使用DDD时,会碰到各种各样晦涩难懂的概念,让人抓狂。今天笔者就以电商平台中的产品管理和订单处理两个具体领域来说明标题所述的子域、实体、值对象和聚合等相关概念。
产品管理:
子域:
产品管理可以被看作整个电商平台的核心子域之一,它涉及到商品的上架、库存管理、分类、定价、描述、图片管理等。
实体:
Product:产品对象,具有唯一标识符(ProductID),以及名称、描述、价格、分类等属性。
Category:类别对象,用于组织商品,并可能包含子类别。
值对象:
Price:价格信息,它可能包含货币和金额。
ProductDescription:产品描述,可以包括文本描述、尺寸、重量等详情。
ProductImage:产品图像对象,包含图像链接和图片的元数据。
聚合:
ProductAggregate:包含 Product实体本身以及与之相关的值对象,如 Price、ProductDescription和 ProductImage。这个聚合可以保证Product的各个属性的一致性。
订单处理:
子域:
订单处理包括但不限于订单创建、支付处理、状态跟踪和订单完成。
实体:
Order:订单对象,具有唯一的订单ID,以及相关联的客户信息、订单项列表、支付信息和状态。
Customer:客户对象,包含客户的身份信息和联系方式。
值对象:
OrderItem:订单项对象,描述了购买的商品和数量。
Address:地址对象,用于订单的收货地址信息。
PaymentDetails:支付明细对象,包括支付方式、支付状态等信息。
聚合:
OrderAggregate:包含 Order实体本身、OrderItem列表、PaymentDetails,以及配送的 Address。聚合确保了订单处理时数据的完整性和一致性。
在设计时,每个实体都应该有一组定义良好的行为,以此来操作其数据。例如,Order实体可能会有添加订单项(AddOrderItem)、确定订单(PlaceOrder)、支付(MakePayment)、更新状态(UpdateStatus)等方法。
总结
实体拥有一个唯一标识符(Identity),即使其他属性相同,具有不同标识符的实体也被视为不同。代表系统中可跟踪的业务实体,其状态可能随时间发生变化。
值对象不拥有唯一标识符,其定义是由其属性值决定的,通常是不可变的,当其中的某个属性发生变化时,会通过创建一个新的值对象实例来替换旧的实例。
聚合则是确保数据一致性的边界,规定外部只能通过聚合根(比如 Order实体)来操作其内部的组件。聚合根负责保护其下的所有实体和值对象不被外部错误地访问。