2016-09-06 6 views
5

アグリゲートを作成する場合、アトリビュート内にバリューオブジェクトを作成するか、すでに作成されたバリューオブジェクトをctorまたはfactoryに渡す必要があります。DDD:ValueオブジェクトをAggregate内でインスタンス化するか、パラメータとして渡しますか?

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

または

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

れる質問:どのようにあなたがそれらのコンストラクタを使用しないと、これらのコンストラクタのパラメータがどこから来るのか? –

答えて

3

値オブジェクトを集計内にインスタンス化するか、パラメータとして渡しますか?

  • 我々はコンストラクタにパラメータを渡すについて話す場合、それがどのように使われるかに依存します。プリミティブ型の使用を必要とするインフラストラクチャの制限があります。

  • パラメータをメソッドに渡すことについて言えば、バリューオブジェクトは私の選択肢の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; 
} 
関連する問題