域驱动设计建模查询

0 domain-driven-design

我正在构建一个新的应用程序,并且是Domain Driven Design的新手.我一直在阅读文档,我已经设法模拟了大部分领域模型,但我想对两个查询提出一些建议:

  1. 我有两个域对象通道和程序.我已将这两者建模为实体,因为两者都可以独立访问.一个频道可以有一个节目列表,所以我把它作为频道的属性.我的查询是如何填充程序列表.是否可以使ChannelService中的getChannerById方法首先获取通道信息,然后调用ProgramService获取通道的程序列表,例如:

    Channel {
      String channelId
      List <Program> programList
    }
    
    Program {
      String programId {
    }
    
    ChannelService {
       Channel getChannelById(String channelId)
    }
    
    ProgramService {  
       Program getProgramById(String programId)
       List <Program> getProgramsByChannelById(String channelId)  
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我有一个产品域对象,但它的一些属性(例如规范和兼容性)涉及相当耗时的操作.这些属性并不是一直需要的,因此可以将这些属性作为域对象的一部分,并且在需要时具有填充这些属性的单独服务方法,例如

    Product {
        String productId
        Specification specification
        List <Product> compatibleProducts
    }
    
    ProductService {
        Product getProduct(String productId);
        void getProductSpecifications(Product product);
        void getCompatibleProducts(Product product);
    }
    
    Run Code Online (Sandbox Code Playgroud)

任何建议将非常感谢.

eul*_*rfx 7

在DDD中设计实体时,不应创建从一个实体到另一个实体的关联,以便该关联仅用于显示或查询目的.虽然一个频道确实有一套节目,但频道与频道实体所需的节目集之间的关联是什么?更重要的是,如果您只考虑查询方面,那么您可能不需要在代码上强制使用DDD.相反,在设计实体时,请考虑这些实体需要实现的行为.如果您的实体没有行为但仅用作数据容器,那么您不需要DDD.要回答你的问题,我会使用满足每个查询要求的读模型类.例如,对于您的产品型号,如果一个查询需要规范属性和这些查询另一个不,创建不同的读模型类.这些类不是实体,它们是简单的只读值对象,它们没有任何行为,它们的工作是表示数据.关于实现查询,您有几个选项.同时调用ChannelService和ProgramService是一种选择.但是,如果数据全部存储在一个数据库中,为什么不创建一个存储库,通过一次调用返回所有必需的数据?有关此主题的更多信息,请查看我在DDD中读取模型的帖子.