2012-11-18 165 views
1

我剛開始學習領域驅動設計,並有我的域名一個項目,該項目的結構是這樣的:領域驅動設計 - 訪問修飾符域實體

  • /實體
  • /邊界
  • /UserStories

據我所知DDD,除了邊界與外界溝通的領域,該領域的一切都應該是無形的。所有的我都域內看到實體類的實例有一個公共接入改性劑,對於這裏的例子,我有一個實體名爲消息:

public class Message 
{   
     private string _text; 

     public string Text 
     { 
      get { return _text; } 
      set { _text = value; } 
     } 

     public Message() 
     { 

     } 

     public bool IsValid() 
     { 
      // Do some validation on text 
     } 
} 

這豈不是更正確的,如果在實體類和其成員標記爲內部,因此只能在域項目中訪問?

例如:

internal class Message 
{   
     private string _text; 

     internal string Text 
     { 
      get { return _text; } 
      set { _text = value; } 
     } 

     internal Message() 
     { 

     } 

     internal bool IsValid() 
     { 
      // Do some validation on text 
     } 
} 

回答

2

我認爲這裏有一個困惑:在限界上下文是定義,其中模型是有效的有沒有類actualy命名邊界上下文的概念。也許這些是反腐目的的對象,但真正的聚合根應該處理有界上下文中的那個或某些入口點。

我不會構建像這樣的域,這是人爲的,您應該根據真實世界過程中的意義來構建域。您正在使用DDD來模擬代碼中的真實世界流程,並且我還沒有聽到任何人在軟件開發之外討論實體或價值對象。他們談論訂單,產品,價格等

Btw該消息幾乎是一個值對象,除非域真的需要唯一標識每個消息。這裏的消息是一個域的概念,我希望你不是指一個命令或一個事件。你應該把驗證放在構造函數或給定新值的方法中。

公平地說,這個代碼是simplelistc的方式,也許你選擇了錯誤的例子。關於課程是內部的還是公共的,它們可能是一種或另一種,它不是一個規則,它取決於很多事情。在某種極端情況下,您將擁有幾乎每個對象都是內部的方法,但實現了應用程序的公共接口,這可能非常低效。

拇指規則:如果該類在域程序集外部使用,使其成爲公共的,如果它是由域內部使用的某個內容和/或實現公共接口,則使其成爲內部。

+0

我認爲你是對的,這可能是錯誤的例子,我可能混合DDD與實體控制邊界模式。感謝你的經驗法則,幫助我很多。 –

+0

@MikeSW:同意。一般來說,我儘可能地封裝,但是這個域是核心,並且是由外層調用的。當然,不要說在程序集外部不使用的類不應該是內部的。 – eulerfx