2010-02-07 77 views
3

我的域實體一字排開,像一棵樹:其中哪些是存儲庫模式?


- 兒童1
- 兒童1.1
- 兒童1.2
- 兒童2
- 兒童2.1
- 兒童2.2

對於如何在這些域對象周圍設計存儲庫,我們最終得到了2個(相當強烈的)意見:

意見1:
我需要2個存儲庫Child1Repository & Child2Repository由RootFacade/RootManager類管理,以調用存儲庫上的相應方法。這兩個子倉庫僅處理DAL操作,而RootFacade則是BLL。該RootFacade暴露DTO的到應用程序,同時內部所有的3個倉庫使用域對象

意見2:
我需要1個庫RootRepository其處理一切(BLL + DAL)。該資源庫公開內部DTO的內部它與域對象

我想對這兩個點&這是真正的方式去執行一個存儲庫實施的一些觀點。

感謝所有幫助比他們需要,而且它肯定聽起來像一個RootRepository的方法

+0

只是要清楚 - 這是一個物理繼承,像一個經理和下屬,或一個類繼承與兒童派生類型? – Aaronaught 2010-02-07 14:29:24

+0

根是各種子元素的容器。根 - 子元素之間沒有物理繼承,但是對所有子元素都有樹繼承 – Sunny 2010-02-07 14:43:08

回答

3

類不應該承擔更多的責任是錯誤的方式去這裏。它吸收了太多的複雜性,並且對太多的實體負責。在你提出的兩個選項中,第一個是更好的選擇:擁有更多的存儲庫,每個存儲庫都負責你的域的角落。

但是,這就是說,我不清楚爲什麼你有一個RootManager。我寧願有一系列DomainObjectRepositories,它們各自在內部管理自己的業務邏輯,只公開相關的公共操作,然後將實際的數據庫操作推遲到數據訪問對象DomainObjectDao。擁有無所不知的全能型邏輯類是一種巨大的代碼味道,在這種特殊情況下會帶來企業級的過度殺傷力。

+0

沒有Root的情況下,子類型不能存在。雖然根 - 子組合之間沒有物理繼承,但Root是各種子項的集合的容器。子項可以是樹集合。 因此,即使我有各種ChildRepository實現,它始終需要Root上下文才能夠執行任何操作。除了業務規則是在根級別定義的,所以問題是我需要跨存儲庫調用以驗證我的規則(因此需要RootFacade/Manager類) – Sunny 2010-02-07 14:50:31

+0

啊,我明白了;你的原始問題並不清楚。然而,我仍然認爲我的答案是:一個'Book'不能存在,沒有'Library'就可以存在,但是在'Books'上可能仍然存在一些與'Libraries'無關的操作(例如,在鎮上的任何圖書館中找到一本書,而不僅僅是特定圖書館的藏書)。 就跨多個存儲庫進行調用而言,如果兩個存儲庫彼此之間已存在某種關係,那沒關係。一個倉庫向另一個倉庫詢問問題並沒有什麼本質的錯誤。 – 2010-02-07 14:54:01

+0

我喜歡你圖書館的例子,因爲它是我的實體排隊。 我的情況的關鍵區別在於,所有的操作都在庫上,如:library.AddBook(),library.IssueBook()等。本書不能有我自己的操作 沒有多庫方案。 – Sunny 2010-02-07 15:11:13

0

我們使用選項1,它適合我們。說孩子1是一個userRepository,孩子2是一個角色庫,其外觀是安全外觀。用戶存儲庫將返回作爲聚合根的用戶域對象,並且用戶對象包含角色。我們只會真正使用GetAllRoles的角色存儲庫。

我們的域對象有一個GetDTO方法,它返回由門面傳輸的dtos。

我希望這會有所幫助。

+1

因此,在這種情況下,UserRepository將處理以下規則:如果用戶處於角色「a」,則不能分配角色「b」 RoleRepository僅執行DAL操作 我的理解是否正確? – Sunny 2010-02-07 15:12:52

+0

沒有這是你的域對象處理業務邏輯的責任。 看看這樣的事情的規格模式。沒有存儲庫應該包含任何業務邏輯。 – Burt 2010-02-07 16:56:23