2012-05-22 54 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