2015-02-12 56 views
0

如果我有一個聚合根說:用戶它擁有財產一樣域驅動設計:聚合根可以有公共setter嗎?

public class User:BaseEntity 
{ 


    public User() 
    { 
     //Ef Use 
    } 

    public User(string firstName, string secondName, 
     string userName,Password password) 
    { 
     this.UserName = userName; 
     this.Password = password; 
     this.FirstName = firstName; 
     this.SecondName = secondName; 
    } 

    public string UserName { get; private set;} 
    public Password Password { get; private set;} 
    public string FirstName { get; private set;} 
    public string SecondName { get; private set;} 
} 

我可以像var naz=new User ("naz","password","firstName","secondname"創建新的用戶) 和保存使用UserRepository。 我應該如何編輯用戶fistname屬性?
我是否需要製作公共setter並使用存儲庫進行保存? 。
我很困惑,對DDD是新的。我應該如何實現這一點。

+3

DDD與技術(戰術)模式無關,如存儲庫。這是關於按照它的方式建模您的域。我們無法知道如何在不知道自己的域名的情況下設計聚合根目錄,但您似乎錯了。 AR不是財產桶,DDD不適合CRUD。如果這是您需要的,請使用ActiveRecord方法,而不要嘗試應用DDD,因爲您認爲它很酷,因爲如果您不瞭解核心戰略模式,就會失敗。 – plalx 2015-02-12 06:04:41

+1

完全同意@plalx, 我可以補充一點,好的問題應該是,更改名字的業務需求是什麼(不知道域名,我認爲沒有意義,用戶更改名稱可能只是爲了糾正大部分情況)。一般來說,我們會預先設定一個更新值的明確方法(例如,當您更改地址時,您不會設置值,您有稱爲移動位置的方法或某種方法;))。 – rad 2015-02-12 11:07:37

回答

0

域實體攜帶狀態,您通常需要能夠更改此狀態。如果你正在使用DDD方法,你的上面的例子我看起來像這樣。

  1. 在提供id和新名稱的應用程序層上調用update方法。
  2. 應用程序層通過存儲庫獲取用戶域模型。
  3. 然後,您可以在您的用戶實體上調用update name方法,或者通過setter來設置它。
  4. 然後你保存你的實體。通常情況下,您可能會使用跟蹤對象更改的ORM,在這種情況下,您只需從應用程序層調用存儲庫中的存儲庫即可。

您的示例並不是一個好的DDD示例,但您的用戶域模型基本上只是一個DTO。

0

更新的用戶名可以通過調用這樣的方法來完成:

public void ChangeUsername(string newName) 
{ 
//Check any required business rules. 
this.UserName = newName; 
} 

你獲得的一點,就是你可以檢查與改變用戶名的任何業務規則。

雖然無處不在 - 語言將更加明確這種方法。