域驱动设计建模查询

时间:2012-05-22 09:29:24

标签: 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)  
    }
    
  2. 我有一个产品域对象,但它的一些属性(例如规范和兼容性)涉及相当耗时的操作。这些属性并不是一直需要的,所以可以将它们作为域对象的一部分放置,并且具有单独的服务方法,这些方法在需要时填充这些属性,例如:

    Product {
        String productId
        Specification specification
        List <Product> compatibleProducts
    }
    
    ProductService {
        Product getProduct(String productId);
        void getProductSpecifications(Product product);
        void getCompatibleProducts(Product product);
    }
    
  3. 非常感谢任何建议。

1 个答案:

答案 0 :(得分:7)

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