news 2026/6/4 6:41:15

DDD-015:领域事件(Domain Event

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DDD-015:领域事件(Domain Event

DDD-015:领域事件(Domain Event)

15.1 领域事件的定义与用途

15.1.1 什么是领域事件?

【原理】
领域事件(Domain Event)是领域中已经发生的、对业务有重要意义的事实。它表示领域内发生的某件事情,通常会导致系统状态的改变或触发其他业务操作。

领域事件的核心特征:

  • 过去时态命名:OrderCreated、PaymentReceived(表示已发生)
  • 不可变性:事件一旦发生,其内容不可更改
  • 业务含义:携带业务相关的数据
  • 时效性:包含事件发生的时间
  • 因果链:一个事件可能触发其他事件

15.1.2 领域事件 vs 系统事件

【对比分析】

维度领域事件系统事件
来源业务领域技术层
命名业务术语(OrderCreated)技术术语(CacheInvalidated)
消费者业务模块技术模块
数据业务数据技术数据
目的业务解耦、流程协调技术解耦、性能优化
// ✅ 领域事件:业务含义明确publicclassOrderCreatedEventextendsDomainEvent{privatefinalOrderIdorderId;privatefinalCustomerIdcustomerId;privatefinalMoneytotalAmount;privatefinalLocalDateTimecreatedAt;}// ❌ 系统事件:技术层面publicclassCacheInvalidatedEvent{privatefinalStringcacheKey;// 这是技术事件,不是领域事件}

15.1.3 领域事件的用途

【核心用途】

用途说明示例
解耦聚合聚合间不直接调用,通过事件通信下单后扣库存
状态同步跨聚合、跨系统状态同步订单完成后更新用户积分
触发流程启动后续业务流程支付成功后触发发货
审计追踪记录业务操作历史记录所有订单状态变更
通知通知外部系统或用户订单取消后发送短信

15.2 领域事件的命名与设计

15.2.1 命名规范

【代码示例】

// ✅ 正确命名:过去时 + 业务对象 + 动作OrderCreatedEvent// 订单已创建PaymentReceivedEvent// 支付已收到OrderShippedEvent// 订单已发货CustomerUpgradedEvent// 客户已升级InventoryReservedEvent// 库存已预留// ❌ 错误命名CreateOrderEvent// 应该是过去时OrderCreateEvent// 应该是过去时OrderEvent// 太模糊,不明确发生了什么OrderStatusChangedEvent// 可以接受,但更具体更好

15.2.2 事件内容设计

【代码示例】

/** * 订单已创建事件 */publicclassOrderCreatedEventextendsDomainEvent{// ========== 事件标识 ==========privatefinalStringeventId;// 事件唯一IDprivatefinalLocalDateTimeoccurredOn;// 事件发生时间privatefinalStringeventType="OrderCreated";// 事件类型// ========== 业务数据 ==========privatefinalOrderIdorderId;// 聚合IDprivatefinalCustomerIdcustomerId;// 客户IDprivatefinalMoneytotalAmount;// 订单金额privatefinalList<OrderItemInfo>items;// 商品列表摘要// ========== 元数据 ==========privatefinalStringtriggeredBy;// 触发者privatefinalintversion=1;// 事件版本// 构造函数publicOrderCreatedEvent(OrderIdorderId,CustomerIdcustomerId,MoneytotalAmount,List<OrderItemInfo>items,StringtriggeredBy){this.eventId=UUID.randomUUID().toString();this.occurredOn=LocalDateTime.now();this.orderId=orderId;this.customerId=customerId;this.totalAmount=totalAmount;this.items=newArrayList<>(items);this.triggeredBy=triggeredBy;}// Getters(不提供Setters,保证不可变)publicStringgetEventId(){returneventId;}publicLocalDateTimegetOccurredOn(){returnoccurredOn;}publicOrderIdgetOrderId(){returnorderId;}publicCustomerIdgetCustomerId(){returncustomerId;}publicMoneygetTotalAmount(){returntotalAmount;}publicList<OrderItemInfo>getItems(){returnCollections.unmodifiableList(items);}publicStringgetTriggeredBy(){returntriggeredBy;}publicStringgetEventType(){returneventType;}publicintgetVersion(){returnversion;}}/** * 订单商品信息(值对象) */publicclassOrderItemInfoimplementsSerializable{privatefinalProductIdproductId;privatefinalStringproductName;privatefinalintquantity;// 构造函数、Getters...}

15.3 事件的发布与订阅

15.3.1 事件基类设计

【代码示例】

/** * 领域事件基类 */publicabstractclassDomainEventimplementsSerializable{privatestaticfinallongserialVersionUID=1L;// 事件唯一标识protectedStringeventId;// 事件发生时间protectedLocalDateTimeoccurredOn;// 事件类型(默认取类名)protectedStringeventType;// 事件版本(用于兼容性)protectedintversion=1;protectedDomainEvent(){this.eventId=UUID.randomUUID().toString();this.occurredOn=LocalDateTime.now();this.eventType=this.getClass().getSimpleName();}// GetterspublicStringgetEventId(){returneventId;}publicLocalDateTimegetOccurredOn(){returnoccurredOn;}publicStringgetEventType(){returneventType;}publicintgetVersion(){returnversion;}/** * 转换为JSON字符串(用于序列化) */publicStringtoJson(){try{ObjectMappermapper=newObjectMapper();mapper.registerModule(newJavaTimeModule());returnmapper.writeValueAsString(this);}catch(JsonProcessingExceptione){thrownewRuntimeException("Failed to serialize event",e);}}}/** * 领域事件发布者接口 */publicinterfaceDomainEventPublisher{/** * 发布单个事件 */voidpublish(DomainEventevent);/** * 批量发布事件 */voidpublishAll(List<DomainEvent>events);}/** * 领域事件订阅者接口 */publicinterfaceDomainEventSubscriber<TextendsDomainEvent>{/** * 处理事件 */voidhandle(Tevent);/** * 订阅的事件类型 */Class<T>subscribedToEventType();}

15.3.2 聚合根支持事件发布

【代码示例】

/** * 聚合根基类 - 支持领域事件 */publicabstractclassAggregateRoot<IDextendsIdentifier>extendsEntity<ID>{// 暂存的领域事件privatefinalList<DomainEvent>domainEvents=newArrayList<>();protectedAggregateRoot(IDid){super(id);}/** * 注册领域事件 */protectedvoidregisterEvent(DomainEventevent){this.domainEvents.add(event);}/** * 获取所有领域事件(只读) */publicList<DomainEvent>getDomainEvents(){returnCollections.unmodifiableList(domainEvents);}/** * 是否有领域事件 */publicbooleanhasDomainEvents(){return!domainEvents.isEmpty();}/** * 清空领域事件(发布后调用) */publicvoidclearDomainEvents(){this.domainEvents.clear();}}/** * 订单聚合根 - 发布事件 */publicclassOrderextendsAggregateRoot<OrderId>{privateOrderIdid;privateOrderStatusstatus;privateMoneytotalAmount;// 创建订单publicstaticOrdercreate(CustomerIdcustomerId){Orderorder=newOrder(OrderId.generate(),customerId);order.registerEvent(newOrderCreatedEvent(order.id,customerId,order.totalAmount,Collections.emptyList(),"system"));returnorder;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/4 6:40:21

终于搞懂了!Token、1M上下文、KV Cache 和大模型记忆的真相

终于搞懂了&#xff01;Token、1M上下文、KV Cache 和大模型记忆的真相 引言 最近在做智能客服、RAG、Agent项目时&#xff0c;我发现很多刚接触大模型的同学&#xff0c;甚至一些已经开始做AI应用开发的开发者&#xff0c;对几个最基础的概念其实并没有真正理解。 例如&…

作者头像 李华
网站建设 2026/6/4 6:40:03

Agnes AI 全家桶深度解析:文本、图像、视频,参数级使用指南

文章目录背景先说结论一、文本模型&#xff1a;Agnes-2.0-Flash定位完整参数表基础请求参数messages 消息格式tools 工具定义格式Thinking 模式参数API 信息模型限制响应格式详解使用建议二、轻量文本模型&#xff1a;Agnes-1.5-Flash定位完整参数表多模态消息格式&#xff08;…

作者头像 李华
网站建设 2026/6/4 6:39:40

亦唐科技数字化转型引领中国智能制造的新潮流

随着信息技术的不断发展&#xff0c;数字化转型已成为全球制造业发展的一大趋势。亦唐科技&#xff08;YIKTONG&#xff09;作为中国智能制造领域的佼佼者&#xff0c;凭借领先的数字化技术&#xff0c;逐步引领国内制造业迈向更智能、更高效、更绿色的新时代。本文将探讨亦唐科…

作者头像 李华
网站建设 2026/6/4 6:39:08

STM32F103C8T6 USB虚拟串口踩坑实录:从驱动安装失败到高速数据传输调试

STM32F103C8T6 USB虚拟串口开发实战&#xff1a;从驱动异常到高速传输优化第一次在STM32F103C8T6上实现USB虚拟串口功能时&#xff0c;设备管理器里那个黄色感叹号让我记忆犹新。作为嵌入式开发者&#xff0c;我们都经历过这种时刻——按照教程一步步操作&#xff0c;结果连最基…

作者头像 李华
网站建设 2026/6/4 6:37:57

GPT-5不存在?2024年大模型真实能力与实用路径

我不能按照该标题生成相关内容&#xff0c;因为&#xff1a;“GPT-5”目前并不存在。截至2024年7月&#xff0c;OpenAI官方未发布、未命名、未确认任何代号为“GPT-5”的模型。其最新公开发布的旗舰模型为GPT-4o&#xff08;2024年5月发布&#xff09;&#xff0c;此前为GPT-4 …

作者头像 李华
网站建设 2026/6/4 6:37:57

Alice-Tools:5个步骤解锁AliceSoft游戏资源的终极指南

Alice-Tools&#xff1a;5个步骤解锁AliceSoft游戏资源的终极指南 【免费下载链接】alice-tools Tools for extracting/editing files from AliceSoft games. 项目地址: https://gitcode.com/gh_mirrors/al/alice-tools 你是否曾经面对AliceSoft游戏的神秘二进制文件感到…

作者头像 李华