2012-01-26 34 views
3

対応するOrderServiceOrderRepositoryの合計ルートOrderがあります。DDD:集約ルートの特殊化

私は、対応するExtendedOrderServiceExtendedOrderRepositoryを持つExtendedOrderを持っています。例えば

class Order { 
    int GetOrderId(); 
} 

class ExtendedOrder : Order { 
    string GetExtendedInfo(); 
} 

私はOrderのリストとしてタイプOrderExtendedOrderの両方を返すようにOrderServiceを持っていると思います。しかしExtendedOrderを取得するには、OrderExtendedOrderの場合は、対応するExtendedOrderServiceに尋ねる必要があります。

この動作は可能ですか? 集約ルートを別の集約ルートに拡張することは合法ですか?

+0

ExtendedOrderはOrderから継承されていますか? –

+0

はい継承しました – Ricibald

+0

Ricibald、2つのクラス定義を投稿できます – smartcaveman

答えて

4

ExtendedOrderServiceは必要ありません。 1つのOrderServiceを使用して、OrderRepositoryとExtendedOrderRepositoryの結果を調整してください。

アプリケーションサービスの役割の詳細については、answer to this questionを参照してください。 アプリケーションサービスは、複数のリポジトリを利用できます。

3

主な質問は、何のために必要なのですか。私はそれが何らかのUIやレポート機能に関係していると思われる。その場合、これらのクエリにドメインモデルの概念を使用しないことをお勧めします。

つまり、一貫性を維持し、複雑なビジネスロジックを制御するためには、レポート関連のクエリからドメインモデルの概念を分離する必要があります。ある時点でその分離をしないと、何らかのUIやレポートの要件を満たすためにドメインモデルを調整することになりますが、これは起こりません。

私は単純に集計を無視し、必要なすべてのデータを選択するクエリを準備します。もちろん、結果に対して何らかのビジネスアクションを実行する場合は、ドメインモデルを使用する必要があります。すべての集計が一貫性を維持する責任があり、一貫性を失う可能性のある唯一のものはデータを更新することです。データを読み取っても変更は発生しません。したがって、集計を読み込みに使用するのは私の意見では無意味です。

ほとんどのシナリオでは、レポート関連の機能をまとめて、ドメインモデルのビジネスコンセプトを調整すべきではありません。

1

ExtendedOrderExtended一部は、私は、継承を介して構図を優先して、その別のエンティティインスタンスのExtendedOrderDetailsを作ると思います(純粋なUI商品ではなく)本当にユビキタス言語のドメイン概念と一部である場合。

これは、オーダー集計の一部であるため、OrderServiceによって提供されるOrderでアクセスできます。

1

ExtendedOrderがOrderから継承した場合、通常はExtendedOrderRepositoryとExtendedOrderServiceはなく、OrderRepositoryとOrderServiceで十分です。

ExtendedOrderは依然としてOrderであるため、Order集約ルートの境界内に存在し、OrderRepositoryとOrderServiceを使用する必要があります。

OrderRepositoryはOrderオブジェクトを返します。これは拡張オーダーでも、そうでなくてもかまいません。 NHibernateなどのORMは、この動作をそのままの状態でサポートします。

このようにして作業すると、より洗練されたコードになり、繰り返しが少なくなります。コードは次のようになります。

public class Order 
{ 
    public virtual void Process() 
    { 
     // do processing stuff to an order 
     // ... 
    } 
} 

public class ExtendedOrder : Order 
{ 
    public override void Process() 
    { 
     // do the standard order processing 
     base.Process(); 
     // do extra processing specific to an extended order 
     // ... 
    } 
} 


public class OrderService 
{ 
    public void ProcessRecentOrders() 
    { 
     IEnumerable<Order> orders = orderRepository.GetRecentOrders(); 
     // orders may include Order and ExtendedOrder objects in the collection... 
     foreach (Order in orders) 
     { 
      // ...but polymorphism ensures that we don't need to know whether order is an ExtendedOrder or an Order 
      order.Process(); 
     } 
    } 
} 

及び必要であれば、あなたはまだ明示的秩序とExtendedOrderを区別することができます。

public void SendOrder(Order order) 
{ 
    // do normal order sending stuff 
    orderSender.TransmitOrder(order); 
    if (order is ExtendedOrder) 
    { 
     // do additional stuff required by an ExtendedOrder 
    } 
} 

このアプローチは、あなたが他の注文の種類(例えば「SpecialOrder」)を作成するために継続することができますなしリポジトリとサービスの普及。

+0

はい、私はドメインメソッドでExtendedOrderに関する特定のデータが必要です – Ricibald

関連する問題