0

いくつかのパラメーターに基づいてオブジェクトのリストを取得したいと考えています。オブジェクトは特定のカテゴリに属しているか、プロパティ xyz などを持っていますか。ID でオブジェクトを取得するかなり単純なリポジトリを作成しました。さまざまなパラメーターと基準に基づいてオブジェクトのリストが必要な場合、それを行うメソッドをリポジトリに追加しますか、または基準に適合するオブジェクトのリストが作成されるまで実行し続けるサービス層にメソッドを追加しますか? ID メソッドで取得したリポジトリを使用して、多くの基準に対してチェックするだけでしょうか?

4

1 に答える 1

2

以下の戦略は、プロジェクトがドメイン オブジェクトを永続オブジェクトとしても使用することに基づいています。

クエリがユーザー検索 (注文検索 UI など) のためだけのものである場合は、インターフェイス コンポーネントでリポジトリを直接呼び出したいと思います。

@Controller
public class OrderAdminController {
     @RequestMapping(........)
     public String search(@ModelAttribute OrderCriteria criteria) {
          PagedList<Order> orders = orderRepository.findBy(criteria);
          //criteria contains dateWhenPlaced, customerNameLike, orderStatus matching and so on.
          .......
     }
}

クエリにドメインの概念が含まれている場合は、 Specificationを使用したいと思います。この場合、最終的に SQL フィルタリングがインフラストラクチャで使用されます (パフォーマンスのために、すべての集計をメモリにロードして java でフィルタリングすることはできません) が、ドメイン ロジックは (アプリケーション層とインフラストラクチャに) リークしません。

public class CancelOverdueOrdersBatch {

    public void run() {
        List<Order> overdues = orderRepository.
             findSatisfying(new OverdueOrderSpecification(clock));
        for (Order order: overdues) {
            //.....cancel
        }
    }
}

public class OverdueOrderSpecification {
    private Clock clock;
    private int overdueMinutes = 30;

    public OrderCriteria asCriteria() { //invoked by repository implementation
         return new OrderCriteria.Builder().orderStatusEq(UNPAID).
             placedBefore(overdueMinutesAgo()).build();
    }

    private Date overdueMinutesAgo() {
        return ....//placedDate calculation based on clock.now() and overdueMinutes 
    }
}
于 2013-10-05T02:04:54.773 に答える