DDD:避免继承和深刻的组合

时间:2017-10-02 18:40:30

标签: domain-driven-design

我最近开始探索DDD并计划使用它。我正在寻找DDD的一些说明,我已经为此创建了一个示例问题,并使用DDD设计了一个解决方案,然后提出了一些问题。如果您需要更多详细信息,请仔细检查并恢复。

问题陈述:构建车辆制造站,允许组装不同的零件并创建车辆。

架构风格:域驱动设计(DDD)

域名条款和关系

  • 制造站可能有0 ... *车辆
  • 车辆可以是汽车/卡车等。
  • 车辆可能有发动机,变速箱,车轮,音乐播放器,后视摄像头等
  • 发动机可以是汽油/柴油
  • 传输可以是自动或手动
  • 车轮可能有管或无内胎轮胎
  • 车辆内可能有数百万个参数,如速度,转速,轮胎压力。
  • 一组参数属于某个组件(引擎,传输,车轮等)。

系统的分层表示

  • 制造站

    |

    • 车辆

      |
      -Car /卡车

      |
      -Engine (E)
      |  
      |---Petrol/Diesel
      |
      -Transmission (T)
      |  
      |---Auto/Manual
      |
      -Wheels (W)
      |
      |---Tube/Tubeless
      |
      -Parameters (Could range to millions)
        |
        |--Speed - E
        |--RPM - E
        |--Coolant - E
        |--Tyre Pressure - W
        |--Audio Level 
        |--RearCameraOn 
        |--DoorLocked 
      

DDD解决方案

有界上下文(已识别)

  • 车辆
  • 引擎
  • 传送
  • 轮子

有界上下文详细信息:

有界上下文 - 站

Aggregate Root
     o Station 
         Slots : List<Slot>
Entities
     o Slot
     o Vehicle : Car/Truck
Value Objects
Repositories
     o StationRepository
Services
     o SlotService
Events
     o VehicleAllocatedToSlot
     o VehicleDeallocatedFromSlot

有界上下文 - 车辆

Aggregate Root
     o Vehicle : Car/Truck
           Parameters: List<Parameter>
Entities
     o Registration
     o Chassis
Value Objects
     o Manufacturer
     o Model
     o Parameter
          Name
          Value
          Type
          Default Value
          Unit
     o Audio System
Repositories
     o VehicleRepository
Services
     o AssemblingService
Events
     o VehicleCreated
     o VehicleDeleted
     o VehicleRegistered
     o VehicleDeregistered
     o AudioSystemAdded
     o AudioSystemRemoved

有界上下文 - 引擎

Aggregate Root
     o Engine
         Parameters: List<Parameter>
Entities
     o ElectronicControllingUnit
Value Objects
     o Gas Pump
     o Valve
     o Filter 
     o Fan
     o Parameter
          Name
          Value
          Type
          Default Value
          Unit
Repositories
     o EngineRepository
Services
Events
     o EngineCreated
     o EngineRemoved
     o FilterAdded
     o FilterRemoved
     o FilterReplaced
     o GasPumpAdded
     o GasPumpRemoved
     o GasPumpReplaced
     o FanAdded  
     o FanRemoved
     o FanReplaced

问题:

  • DRY被违反。我们可以看到&#39;参数&#39;在几乎所有服务中都有定义。

    o建议为参数设置单独的Bounded Context / AR吗?在这种情况下,组件(引擎或轮子)是否在其自身内部保留参数ID的列表,或者每个参数是否包含父ID?

  • 客户如何在一次通话中创建一台带引擎,变速箱和4个车轮的汽车?

  • 如何实现不同组件之间的关系?例如,特定发动机如何知道它属于哪辆汽车/卡车?我们如何重建汽车/卡车?

  • 如何使用DDD管理继承深度?  o车辆 - &gt;汽车 - &gt;福特/丰田?

  • 如何使用DDD管理深层组合?我们如何压缩聚合?

    o Station - &gt;汽车 - &gt;引擎 - &gt;范 - &gt;参数(Fan Sped) - &gt;值

       Station.Car.Engine.Fan.Speed 
       How to retrieve Speed(Parameter) value in other Bounded context
    

提前致谢!

0 个答案:

没有答案