2013-04-24 37 views
3

我最近在學DDD,不太理解這些概念。我有一些關於示例博客應用程序的問題。域驅動設計(示例博客應用程序)

我們假設博客系統中有四個域對象:UserBlog,PostComment。一個User只能有一個BlogBlog具有多個Post個實體,並且Post有許多個Comment個實體。

我的設計是Blog是聚合根:

class Blog { 
    private User; 
    private List<Post> posts; 
} 

class Post { 
    private List<Comment> comments; 
} 

class BlogRepository { 
    public void saveBlog(Blog blog); 
    public void findBlogById(long id); 
    public void getAllBlogs(); 
} 

我說得對不對設計聚合根和存儲庫這樣嗎?

我有一些要求,把所有的Comment實體由用戶所有Blog實體加入,也是User被允許修改他/她自己的Comment

我的問題是我如何實現這些要求?

+1

儘量避免像設計數據庫架構那樣考慮任何領域建模。 1對1或1對多關係是典型的關係數據庫思維。他們在DDD中沒有地位。 – MikeSW 2013-04-29 07:39:04

回答

2

雖然您提供的模型反映了域,但它不是最優的DDD實現。有了DDD,除了考慮實體之間的關係外,還必須考慮事務一致性邊界。因此,最好將Blog,PostUser設計爲單獨的聚合,它們僅通過ID互相引用。此外,沒有理由Blog實體需要有一系列帖子。您永遠不需要加載整個博客,行爲永遠不會跨越多個帖子。相反,請提供分頁存儲庫方法以加載博客的一部分帖子。然而,一個Comment可以是一個值對象,因此評論集合應該與Post聚合一起加載。獲取用戶所有評論的最簡單方法是創建一個存儲庫查詢方法,該方法返回一個read-model以防止實體中的查詢與行爲混淆。有關設計聚合物的更多信息,請參閱Effective Aggregate Design

+2

由於我正在開發一個使用DDD的博客引擎,我在這些問題上給了很多想法,我可以說評論不是一個價值對象。它是一個實體:評論本身與郵政和郵政AR沒有直接關係(我只是在談論這個領域)沒有理由知道評論。帖子和評論是相互關聯的,但它們相當獨立。一個人可以沒有其他功能。閱讀模型「結婚」他們,甚至當時,只有上下文的相關位。 – MikeSW 2013-04-29 07:28:19

+0

這當然有道理。看起來你可以從最初將評論建模爲VO來發展,然後當需要更多關於評論的功能時,它可以被「提升」爲AR。 – eulerfx 2013-04-29 17:05:18

+0

@MikeSW:這是否意味着我需要有一個CommentRepository? – davenkin 2013-05-01 00:54:25