2009-07-09 6 views
4

ここに大きな設計上の欠陥がありますが、解決には問題があります。DDD - DBキーを返すリポジトリパターン?

ビジネスのニーズは多少ありますので、これを単純にしておきます。 私たちは、購入したテーブルと返品のテーブルを持っています。返品が行われると、db内の最も古い購入に戻ってきたものを見つけ、それを「返品済み」テーブルに記録する必要があります。

したがって、返品を挿入すると、その取引内で返品を購入記録に適用する必要があります。

今のところ、私たちは、挿入のためにリポジトリを呼び出すサービスを持っています。サービスは、挿入されたレコードのキーが何であるかを知る必要があるため、そのキーを使用して「適用済み」レコードを挿入してトランザクションを終了することができます。

私は、リポジトリがこの種のデータを返すべきではないということを理解しているので、基本的に固執しています。これはリポジトリがコレクションであるという考えを打ち消していないのですか?

代替手段は何ですか。

明確化:リターンはあるので、ときに我々は購入テーブル、リターンテーブル、および適用される表は、この purchaseId returnId qtyReturned

のように見えます

アプライド・テーブルを持っている

挿入された私は購入のID(いくつかのビジネスルールによって決まる)と新しく挿入されたリターンのIDが必要です。

答えて

1

は、私は、次のあなたの質問に応じたとします。このため

public class Purchase { 

    // ReturnRepository plays the role of collaborator 
    public Return returnMe(PurchaseRepository purchaseRepository, int quantity) { 
     return purchaseRepository.returnPurchase(this, quantity); 
    } 

} 


public class PurchaseRepositoryImpl implements PurchaseRepository { 

    // returnd Purchase object has its id set up 
    public Purchase getOldestPurchase() { 
     // logic in order to get oldest purchase 
    } 

    public Return returnPurchase(Purchase purchase, quantity) { 
     // logic in order to save a return record 
     // Some ORM frameworks returns ids when a record is saved. In my case, Hibernate or NHibernate (.NET) fulfill ths requirement 

     // Then purchaseId, returnId and quantity is saved in "returns applied" table 
    } 

} 


public class PurchaseServiceImpl implements PurchaseService { 

    // Injected through dependency injection 
    private PurchaseRepository purchaseRepository; 

    // Spring transaction boundary, for example 
    // Notice returnPurchase method returns a Return object 
    public Return returnPurchase(int quantity) { 
     Purchase purchase = purchaseRepository.getOldestPurchase(); 

     return purchase.returnMe(purchaseRepository, quantity); 
    } 

} 
+0

こんにちはアーサー、感謝を。私はあなたがこれでどこに行くのか見ていると思うが、上記の私の説明を参照してください。適用されたテーブルに挿入するために挿入された戻り値のIDの必要性をどうやって処理するのですか? – jlembke

+0

追加のコメントを参照してください。それがあなたに役立つことを願っています について、 –

+1

私はこのデザインパターンを "場所全体のリポジトリ"と呼びます。 – zvolkov