0

我正在构建一个新应用程序,并且是域驱动设计的新手。我一直在阅读文档,并且设法对大部分域模型进行建模,但我想要一些关于两个查询的建议:

  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);
    }
    

任何建议将不胜感激。

4

1 回答 1

7

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

于 2012-05-22T16:54:53.463 回答