2012-09-11 26 views
2

仍在嘗試使用DDD並且有一些疑問,也許有人會幫助我。DDD:將邏輯放入聚合根的地方

讓說我有2種型號:

public class Event 
{ 
    User Creator; 
    List<User> Members; 
} 

public class User {} 

我的問題是,我不能看到,我想實現邏輯的地方。我需要三個動作:

  • 用戶參加活動
  • 用戶離開事件
  • 造物主從事件刪除用戶(唯一創造者可以刪除用戶)

現在我剛剛創建的域服務EventUserService即調用Event.RemoveUser/AddUser即ie。檢查是否當前用戶(由UserService提供)是事件的創建者(有權移除其他用戶)。 也許這種方法是可以的,但我仍然認爲我應該把這個邏輯推入聚合根,也就是說。 :

  • User.JoinEvent(Event) - 我可以添加通過事件到User.Events集合(雙向)基於一些邏輯。
  • User.LeaveEvent(Event) - 類似於JoinEvent。
  • User.RemoveUserFromEvent(用戶,事件) - 我能有CreatedEvents收集用戶事件從收集我可以調用Event.RemoveUser(用戶) - 這樣我將確保只有創作者才能踢人。 或
  • Evet.RemoveUser(UserToRemove) - 但我如何確保它被創作者調用?

如果前兩種方法看起來不錯(至少對我來說),第三人會創造Event.RemoveUser(管理事件成員集合)方法,該方法可以用來旁路邏輯居住在User.RemoveUserFromEvent

那麼,到底我有2個問題:

  1. 什麼是你在這樣,其中兩個聚合根一起工作情況的方法和一個操作是由居住在他們兩人的邏輯判斷?也許某種方式像User.CanJoinEvent(Event)
  2. 什麼樣User.RemoveUserFromEvent

打造「危險」點也許有人可以在推杆,對我一點點光,每次幫助將是不錯的。

回答

1
public class Event 
{ 
    User Creator; 
    List<User> Members; 
} 

不這樣做。您正在違反Demeter Law Of,並且Event類無法控制Members或該列表中的用戶中的更改。您應該在Event類中定義用於處理成員的方法。現在

,如果你這樣做的改變,即有這樣的事情:

public class Event 
{ 
    User Creator { get private set; } 
    bool IsMember(string name); 
    void AddMember(User user); 
} 

你會突然有堅實的地方產生的事件。

但我如何確保它被創作者調用?

在.NET中,您可以使用Thread.CurrentPrinicpal來獲取有關登錄用戶的信息。但是,它要求您實施自己的IPrincipal/IIdentity

切記:您應始終確保模型在DDD中處於有效狀態。這通常意味着所有安裝人員應該是私人的:http://blog.gauffin.org/2012/06/protect-your-data/

+0

Thx for answer。在發佈這個問題後,我更加想着你給我的解決方案,關於你提到的責任和法律。對當前用戶還有一些疑問 - 那麼不是基礎設施的一部分呢?但是如果是這樣 - 那麼如何處理依賴於當前用戶的邏輯呢?將當前用戶作爲參數並「相信」這是當前用戶,而不是其他任何用戶?在我的情況下,我正在考慮通過參數傳遞服務給方法,而不是使用某些靜態屬性。 – mgibas

+0

是的。使用服務並傳遞當前用戶是更好的解決方案。但是imho,IIdentity/IPrincipal在.NET中並且易於調整。在驗證內容時,我在我的應用程序中使用它。 – jgauffin