化妆品销售网站的源代码济南seo
2026/5/14 0:52:20 网站建设 项目流程
化妆品销售网站的源代码,济南seo,国外服务器做视频网站,徐州手机网站建设公司哪家好基于SmartRM智能零售机项目的Trade(交易)模块实战解析 目录 DDD四层架构概述 领域层(Domain Layer)详解 应用层(Application Layer)详解 适配器层(Adapter Layer)详解 基础设施层(Infrastructure Layer)详解 依赖关系与边界划分 DDD核心概念落地实践 最佳实践与反模式…基于SmartRM智能零售机项目的Trade(交易)模块实战解析目录DDD四层架构概述领域层(Domain Layer)详解应用层(Application Layer)详解适配器层(Adapter Layer)详解基础设施层(Infrastructure Layer)详解依赖关系与边界划分DDD核心概念落地实践最佳实践与反模式一、DDD四层架构概述1.1 架构分层原则DDD采用经典的四层架构,从上到下依次为:┌─────────────────────────────────────────┐ │ Adapter Layer (适配器层) │ │ - API Controllers │ │ - Event Handlers │ │ - Repository Implementations │ │ - Remote Service Implementations │ ├─────────────────────────────────────────┤ │ Application Layer (应用层) │ │ - Application Services │ │ - DTOs │ │ - Executors │ ├─────────────────────────────────────────┤ │ Domain Layer (领域层) │ │ - Entities / Aggregates │ │ - Value Objects │ │ - Domain Events │ │ - Domain Services │ │ - Repository Interfaces │ │ - Remote Service Interfaces │ ├─────────────────────────────────────────┤ │ Infrastructure Layer (基础设施层) │ │ - Data Objects (DO) │ │ - Mappers │ │ - Error Codes │ └─────────────────────────────────────────┘1.2 目录结构标准以Trade模块为例,标准的DDD项目结构如下:trade/ ├── adapter/ # 适配器层 │ ├── api/ │ │ └── controller/ # REST API控制器 │ ├── eventhandler/ # 领域事件处理器 │ ├── remote/ # 远程服务实现(防腐层) │ └── repository/ │ └── impl/ # 仓储接口实现 ├── application/ # 应用层 │ ├── dto/ # 数据传输对象 │ ├── executor/ # 任务执行器 │ └── AppTradeService.java # 应用服务 ├── domain/ # 领域层(核心) │ ├── event/ # 领域事件 │ ├── remote/ # 远程服务接口定义 │ ├── repository/ # 仓储接口定义 │ ├── Order.java # 实体 │ ├── SlotVendingMachine.java # 聚合根 │ ├── StockedCommodity.java # 值对象 │ ├── OrderState.java # 枚举 │ └── ActivityService.java # 领域服务 └── infrastructure/ # 基础设施层 ├── dataobject/ # 数据对象(DO) ├── mapper/ # MyBatis Mapper └── TradeError.java # 错误码定义二、领域层(Domain Layer)详解领域层是DDD的核心,包含业务逻辑和规则,独立于技术实现。2.1 聚合根(Aggregate Root)定义位置:domain/XXXAggregate.java职责:作为聚合的入口点,保证聚合内的一致性边界封装业务规则和状态转换逻辑发布领域事件管理聚合内的生命周期实战示例:trade/domain/SlotVendingMachine.java:29-218/** * 货道售卖机聚合根 * 继承AggregateBase获得版本号、事件总线等基础能力 */publicclassSlotVendingMachineextendsAggregateBase{// 聚合状态privatelongmachineId;privateSlotVendingMachineStatestate;privateOrdercurOrder;// 聚合内实体/** * 核心业务方法:选择商品 * 1. 校验设备状态 * 2. 校验库存 * 3. 生成订单 * 4. 发布领域事件 * 5. 调用支付服务 * 6. 更新状态 */publicPaymentQrCodeselectCommodity(CollectionStockedCommoditycommodities,TradeDeviceServicedeviceService,TradePayServicepayService,PlatformTypeplatformType){// 业务规则校验if(state!=SlotVendingMachineState.Ready){thrownewDomainException(TradeError.VendingMachineStateNotRight);}if(!checkInventory(commodities,deviceService)){thrownewDomainException(TradeError.InventoryCheckFail);}// 生成订单curOrder=this.generateOrder(commodities);// 发布领域事件emitEvent(newOrderCreatedEvent(this.machineId,curOrder));// 状态转换state=SlotVendingMachineState.Trading;// 调用外部服务PaymentQrCoderet=payService.startQrCodePayForOrder(platformType,curOrder);curOrder.setPaymentId(ret.getPaymentId());// 增加版本号(乐观锁)incVersion();returnret;}// 使用Builder模式构建聚合publicstaticBuilderBuilder(){returnnewBuilder();}publicstaticclassBuilder{privatelongmachineId;privateSlotVendingMachineStatestate;privateOrdercurOrder;privatelongversion;privateDomainEventBuseventBus;publicSlotVendingMachinebuild(){// 构建时进行必要的校验if(this.eventBus==null){thrownewDomainException(CommonError.UnExpected);}// ... 构建逻辑}}}关键要点:✅ 聚合根继承AggregateBase获得版本控制能力✅ 使用Builder模式构建复杂对象✅ 业务方法封装完整的业务规则✅ 通过emitEvent发布领域事件✅ 使用incVersion()支持乐观锁2.2 实体(Entity)定义位置:domain/XXXEntity.java职责:有唯一标识的领域对象封装业务行为和状态可以发布领域事件实战示例:trade/domain/Order.java:17-162/** * 订单实体 * 特征:有orderId作为唯一标识 */publicclassOrder{// 唯一标识privatelongorderId;// 属性privatelongmachineId;privatelongpaymentId;privateOrderStatestate;privateOrderTypetype;privateListStockedCommoditycommodities;// 事件总线(用于发布事件)privateDomainEventBuseventBus;/** * 业务方法:取消订单 * 改变状态 + 发布领域事件 */publicvoidcancel(){state=OrderState.Canceled;eventBus.post(newOrderCanceledEvent(this));}/** * 业务方法:订单成功 */publicvoidsucceed(){state=OrderState.Success;eventBus.post(newOrderSucceededEvent(this));}/** * 业务计算:计算订单总金额 */publicBigDecimaltotalAmount(){BigDecimalret=newBigDecimal(0);for(StockedCommoditycommodity:commodities){ret=ret.add(commodity.getPrice().multiply(newBigDecimal(commodity.getCount())));}returnret;}// 私有构造函数,强制使用BuilderprivateOrder(){}// Builder模式publicstaticclassBuilder{// ... Builder实现publicOrderbuild(){// 构建时进行业务规则校验if(machineId==0||state==null||type==null){thrownewDomainException(CommonError.InvalidProperty);}// ...}}}实体 vs 聚合根:相同点: 都有唯一标识,都封装业务逻辑不同点:聚合根是对外的统一入口实体可以被聚合根引用,但不能单独被外部访问2.3 值对象(Value Object)定义位置:domain/XXXValueObject.java或直接在domain根目录职责:无唯一标识,通过属性值判断相等性不可变对象(Immutable)封装概念完整性实战示例:trade/domain/StockedCommodity.java/** * 库存商品值对象 * 特征: * 1. 无唯一ID(commodityId是商品ID,不是这个值对象的ID) * 2. 通过全部属性值判断相等性 * 3. 不可变(所有字段final,只有getter无setter) */publicclassStockedCommodity{privatefinalStringcommodityId;privatefinalStringname;privatefinalStringimageUrl;privatefinalBigDecimalprice;privatefinalintcount;// 构造时赋值,之后不可变publicStockedCommodity(StringcommodityId,Stringname,StringimageUrl,BigDecimalprice,intcount){this.commodityId=commodityId;this.name=name;this.imageUrl=imageUrl;this.price=price;this.count=count;}// 只提供getter,无setterpublicStringgetCommodityId(){returncommodityId;}publicStringgetName(){returnname;}publicBigDecimalgetPrice(){returnprice;}publicintgetCount(){returncount;}// 重写equals和hashCode(基于所有属性)@Overridepublicbooleanequals(Objecto){if(this==o)returntrue;if(!(oinstanceofStockedCommodity))returnfalse;StockedCommoditythat=(StockedCommodity)o;returncount==that.countObjects.equals(commodityId,that.commodityId)Objects.equals(name,that.name)Objects.equals(price,that.price);}}关键原则:✅ 所有字段声明为final✅ 只提供getter,不提供setter✅ 通过构造函数一次性初始化✅ 重写equals和hashCode2.4 领域事件(Domain Event)定义位置:domain/event/XXXEvent.java职责:表示领域中发生的重要业务事件实现聚合间的解耦通信支持事件溯源实战示例:trade/domain/event/OrderCreatedEvent.java:12-55/** * 订单创建事件 * 继承DomainEvent基类 */publicclassOrderCreatedEventextendsDomainEvent{// 事件携带的数据privatelongmachineId;privatelongorderId;privateOrderTypeorderType;privateBigDecimaltotalAmount;/** * 构造函数:从聚合或实体构造事件 */publicOrderCreatedEvent(longmachineId,Orderorder){super("trade.OrderCreatedEvent");// 事件名称this.machineId=machineId;this.orderId=order.getOrderId();this.orderType=order.getType();this.totalAmount=order.totalAmount();}/** * 事件分区键(用于保证同一聚合的事件顺序) */@OverridepublicStringkey(){returnLong.toString(machineId);}// Getters...}事件命名规范:使用过去式:OrderCreated,PaymentSucceeded,OrderCanceled命名格式:{聚合名}{动作过去式}Event2.5 仓储接口(Repository Interface)定义位置:domain/repository/XXXRepository.java职责:定义聚合的持久化契约提供聚合的查询和保存方法隔离领域层与基础设施层实战示例:trade/domain/repository/OrderRepository.java:9-19/** * 订单仓储接口 * 定义在领域层,实现在适配器层 */publicinterfaceOrderRepository{/** * 根据ID获取订单聚合 */OrdergetOrderById(longorderId);/** * 添加新订单 */

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询