2010-12-01 18 views
7

私は(OrderOrderLinesProductCategoriesなどのようなエンティティとサンプルeコマースサイトを開発することによって)DDDを学ぶ私の手が汚れて取得しようとしています。 私はOrderクラスがOrderLineの集約ルートであるべきだと私は思っていました。DDD - 集約ルート - 例受注とオーダーライン

これまでのところうまくいきましたが、UIから注文フローを定義すると混乱します。 私は私のためのオブジェクトにオーダーラインを追加したい場合は、私が得るべきか/ OrderLineオブジェクトのインスタンスを作成します。

  1. は、私は私のUI /サービスクラスに新しいOrderLine()文をハードコードすべきを
  2. 万一OrderクラスにproductID,quantityなどのパラメータを持つメソッドを定義しますか?

また、DIを使用して、UIまたはOrderクラスからハードコードされたインスタンス化を削除したい場合はどうすればよいですか。このための最良の方法は何でしょうか?

答えて

2

私が注文 クラスは オーダーライン用aggreagrteルートであるべきと思った程度 集約ルートの概念を知覚できるものから。

はい、OrderLineは親注文の外で意味をなさないため、Orderルートの下にある可能性が高いです。

私は(新しいオーダーラインをハードコーディングします)私のUI /サービスクラスの 声明

おそらくない、これはそれが頻繁に発生し、動作するように作られている方法ですが。問題は、私が見ているように、オブジェクトの構築が異なるコンテキストで行われることが多く、検証の制約はそのコンテキストによって異なります。

私はのproductID、Orderクラスでの数量など のような のパラメータを持つメソッドを定義する必要がありますか?

のように:これはそれを行うための一つの方法である

public OrderLine AddOrderLine(Product product, int Quantity ...) 

。注意ProductIdの代わりにProductクラスを使用しました。場合によっては、一方が他方よりも好ましい場合があります。私はいろいろな理由で両方を使用していることがわかります。IDを持っていて、集約ルートを取得する正当な理由がない場合があります。操作を検証するために別のルートが必要になることがあります。

これを行うもう1つの方法は、子ども用のカスタムコレクションを実装することです。

だから私は持っている:

order.OrderLines.Add(product, quantity); 

エンティティのルートは、それが混乱を避け、多くの子のコレクションを持っている場合、これはもう少し自然やOO、特に感じています。

order.AddOrderLine()order.AddXXX()order.AddYYY()order.AddZZZ()

order.OrderLines.Add()order.ZZZs.Add()、またorder.YYYs.Add()

、私はUI から ハードコードされたインスタンスを削除する場合またはDIを使用してOrderクラスを作成します。これには何が最も良い方法は でしょうか?

これは、Factoryパターンのテキストブックケースです。そのようなファクトリを自分のカスタムコレクションに挿入して、Add()メソッドのインスタンス化をサポートします。

+1

オーダーは考えていません。オーダーラインは追加です。カプセル化と呼ばれるOOのことがあります。あなたのクラスに多くのXXX、ZZ​​Z、YYYがあるなら、それを再設計するほうが良い(良いオブジェクト指向設計は多くの小さなオブジェクトを持つ傾向がある)。あなたは、コレクションをカプセル化し、列車の難破(流暢なインターフェイスは別のケースです)を避ける利点については、Googleをすることができます。 –

2

OrderLineファクトリを使用してOrderlinesのインスタンスを取得できます。ファクトリメソッドにパラメータを渡してOrderLineオブジェクトをファクトリに「新しく作成」し、新しいインスタンスをOrderオブジェクトに返します。常にインスタンシエーションを分離しようとするとUIでそれをしないでください。このテクニックを使用する質問hereがあります。

ここにはDDDに役立つ素晴らしい本があります。

関連する問題