2016-09-06 68 views
5

創建聚合時,我們應該在聚集內創建值對象,還是應該將已創建的值對象傳遞給聚合器或工廠。DDD:在Aggregate中實例化Value對象還是將它作爲參數傳遞?

public Booking(DateTime arrivalDate, DateTime departureDate) 
{ 
     this.ArrivalAndDepartureinformation = new ArrivalAndDepartureInfo(arrivalDate, departureDate); 
} 

public Booking(ArrivalAndDepartureinformation arrivalAndDepartureInfo) 
{ 
      this.ArrivalAndDepartureinformation = arrivalAndDepartureInfo; 
} 
+0

這樣的問題:你如何使用這些構造函數和在哪裏這些構造函數的參數從何而來? –

回答

3

在Aggregate中實例化Value對象還是將它作爲參數傳遞?

  • 如果我們談論傳遞參數到構造函數,這取決於如何使用它。可能會有一些基礎結構限制需要使用原始類型。

  • 如果我們談論傳遞參數到方法中,Value Objects是我選擇的100%。

在一般情況下,我會說最好是價值的物品傳遞到您的聚集

值對象可以:

  • 所做出的語言模型更具表現力
  • 帶來的類型安全
  • 封裝驗證規則
  • 自己的行爲
+1

因此,發送到應用程序服務的輸入參數用於構造將發送到聚合工廠或構件的值對象 – Robert

+0

是的。你可以在你的模型中獲得更少的參數,更具體的參數類型和更多表達性語言。 –

3

域模型應該講域,而不是執行原語。

您的應用程序組件通常負責獲取原始數據並以模型語言表達它。

2

的一般準則,我會建議是這樣的:

  • 在域模型中,儘可能使用值對象。
  • 將原語轉換爲域模型(控制器,應用程序服務)邊界處的值對象。

例如,而不是這樣的:

public void Process(string oldEmail, string newEmail) 
{ 
    Result<Email> oldEmailResult = Email.Create(oldEmail); 
    Result<Email> newEmailResult = Email.Create(newEmail); 

    if (oldEmailResult.Failure || newEmailResult.Failure) 
     return; 

    string oldEmailValue = oldEmailResult.Value; 
    Customer customer = GetCustomerByEmail(oldEmailValue); 
    customer.Email = newEmailResult.Value; 
} 

這樣做:

public void Process(Email oldEmail, Email newEmail) 
{ 
    Customer customer = GetCustomerByEmail(oldEmail); 
    customer.Email = newEmail; 
} 
相關問題