【问题标题】:Domain Driven Design modelling queries领域驱动设计建模查询
【发布时间】:2012-05-28 18:48:29
【问题描述】:

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

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

非常感谢任何建议。

【问题讨论】:

    标签: domain-driven-design


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      • 1970-01-01
      相关资源
      最近更新 更多