12

我的數據庫比較小,有8個表,每個表少於5列。我使用EF。我創建了單個存儲庫類,但現在我認爲它可能不是正確的方式來使用它。我應該爲每個控制器分別存儲庫類嗎?比方說我有產品,用戶,Unicorns是否可以讓單個存儲庫類與所有這些控制器一起操作並在每個控制器中實例化,還是應該爲每個控制器創建單獨的存儲庫類?單個或多個存儲庫類?

回答

10

DDD的關鍵概念之一是聚合根 - 這是您通過其管理整套相關實體的「頂級」實體。例如,在一個零售場景中,'訂單'將是一個可以訪問訂單本身的集合根,一個OrderItems列表(即產品+金額+修飾符,例如折扣),BillingAddress,ShippingAddress和PaymentMethod 。其中每一個都與訂單本身密切相關,直到他們沒有理由超出訂單範圍。

每個聚合根應該有一個存儲庫,它擁有在根目錄下持久保存對象的整個子圖的責任。所以在上面的例子中,你不需要或需要一個OrderItems的存儲庫,它允許獨立地訪問訂購商品;相反,您應該實施一個OrdersRepository處理Orders及其所有子組件作爲一個單元。

根據您的特定域模型,您可能需要一個或多個存儲庫,但當然不是每個實體類型都有一個。在尋找聚合根時要問的關鍵問題是「這個實體是否有自己的身份和生命週期?」訂單確實,OrderItems沒有。

+0

很好的答案!有用的文章解釋了這個概念http://devlicio.us/blogs/casey/archive/2009/02/16/ddd-aggregates-and-aggregate-roots.aspx – GibboK

1

我不認爲每個實體的repoistory是一個好主意,而是每個服務的存儲庫,如果這是有道理的。

例如,如果我的主要應用程序的焦點在用戶上,我不會去製作CategoriesRepository或CarsRepository。

2

想到領域驅動設計,考慮到這一點,您將項目的邏輯結構劃分爲不僅僅是類,而是作爲域,這意味着所有操作都與Product有關,它們位於ProductsController之內因此在ProductsRepository之內,所以我更喜歡很多存儲庫,每個存儲庫都配備了操作來處理項目的某些方面。

並不是所有方面都需要一個存儲庫,但這就是您的決定。