2012-05-22 134 views
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); 
    } 
    

任何意见将非常感谢。

回答

6

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

+0

感谢您的建议。 – Surjit