2016-08-25 64 views
0

這是建議的方式來實現在下面的例子_customRoleRepository? 以下代碼在應用程序服務中執行。DDD庫輸入參數

var user = _userRepository.GetById(1); 
var customRole = _customRoleRepository.GetById(user.CustomRoleId); 

var user = _userRepository.GetById(1); 
var customRole = _customRoleRepository.GetForUser(user); 
+0

哪些用戶和他們的角色被加載? – tomliversidge

+0

@tomliversidge創建身份驗證令牌並獲取角色權限以將其與該令牌綁定 – Robert

回答

1

鑑於兩種選擇,我可能會去的第一個,這使通過ID訪問的一致性。

如果可能的話,當你加載用戶避免另一輪的訪問數據庫,尤其是如果這是一個常見的操作可能是最好加載自定義角色。這可以作爲讀取模型來實現。

這是假設你已經正確地模仿你的聚集... :)

+0

有點像CQRS? – Robert

+1

術語可以取決於你與誰交談:)但是當我們經常使用術語CQRS(命令查詢責任分離)時,有一個單獨的數據存儲區用於讀取,這些數據存儲區預先準備投放到響應所需的讀取模型中。它基於事件流異步保持最新。然而,另一個同樣有效的技術是CQS(命令查詢分離),即當您有一組查詢針對寫入模型持久性存儲運行標準查詢時。查詢在應用程序中是_separated_,但是讀取的模型並未完全_seregreg_。 –

+0

因此,對於我來說,實現一個簡單地將Users表連接到CustomRoles表的讀取模型查詢,並返回一個讀取模型dto就是CQS。而且,如果數據直接發佈到UI或API響應數據,我認爲這只是一個好主意。如果您打算使用返回的數據與域聚合/實體進行交互,那麼您使用存儲庫所做的更好,因爲您將域模型與域模型配合使用,並保持獨立的訪問策略。 –

0

討厭這樣說,但在DDD的環境,我的答案是沒有。

在第一個示例中,角色存儲庫可以不理會用戶域,但這意味着應用程序需要知道獲取角色以便將用戶ID從用戶中提取出來,然後查詢另一個存儲庫。換句話說,應用程序充當用戶和角色之間的映射器。

在第二個例子中,角色存儲庫現在需要了解的用戶域。不是很好,但另一方面,應用程序不再需要了解roleId。這很好。這兩種方法之間經典的折衷。

但在這兩種情況下,應用程序仍然需要兩個倉庫來獲得它的信息。當需要更多關係時會發生什麼?存儲庫的數量可以迅速增長,事情變得一團糟。

在領域驅動設計,你應該儘量想在總根(AR)和域環境方面。對於您的示例上下文,用戶是一個AR,角色成爲一個孩子。所以,你可能有:

var user = _userFinder.GetById(1); 
var customRole = user.CustomRole; 

這隱藏了大部分從您的應用程序的實施細則,並允許你專注於你的域實體實際上需要做的。

+0

CustomRole代表BC中的另一個AggregateRoot。它有實體(權限)等。多用戶可以共享相同的CustomRole。你的建議是將CustomRole作爲一個值對象,當CustomRole得到更新時,我必須將該更改傳播給該角色中的所有用戶? – Robert

+0

同一個bc內的兩個ars聽起來很麻煩。在你的例子中,我認爲角色是一個價值對象。我將有一個不同的bc更新角色,是發送通知告訴用戶角色已更改。當然,這很大程度上取決於您是否真的需要處理複雜的業務邏輯。很難在不知道大局的情況下提出具體的建議。 – Cerad

+0

順便說一句,我認爲這些問題得到了更好的迴應http://programmers.stackexchange.com/ – Cerad

1

兩者都同樣有效,這取決於你的需求。 GetForUser會很好,如果你想確保調用代碼在你嘗試和檢索角色之前有一個有效的用戶聚合 - 當它確實將customRoleRepository耦合到用戶聚合的知識,如果你想要求調用代碼有一個有效用戶聚合,那麼這個耦合有一個目的。

GetByUserIdGetById更加一致,而且具有更少的耦合,因此,如果在你的情況下也沒關係調用GetByUserId即使客戶沒有一個有效的用戶聚集,那也沒關係。

如果您正在加載ById,我也使用類型的身份valueobjects可以說是相當有幫助的發現提供類型額外的安全水平 - 有什麼好處和缺點在這裏一些https://stackoverflow.com/a/5377460/6720449談話,在這裏https://groups.google.com/forum/#!topic/dddcqrs/WQ9zRtW3Gbg