私は、DDDの "仕様"に基づいてデータベースの内容を照会するうまいエレガントな方法を見つけようとしています。仕様をクエリ述語に翻訳する
ドメイン駆動型設計では、特定のオブジェクト(候補とも呼ばれます)が(ドメイン固有の)要件に準拠しているかどうかを確認するための仕様が使用されます。例えば、仕様「IsTaskDoneは」のように進む:
class IsTaskDone extends Specification<Task> {
boolean isSatisfiedBy(Task candidate) {
return candidate.isDone();
}
}
上記の明細書は、例えば、多くの目的のために使用することができますタスクが完了したかどうかを検証したり、完了したすべてのタスクをコレクションからフィルタリングしたりするために使用できます。 しかし、この素敵なドメイン関連の仕様を再利用してデータベースのクエリを実行したいと思います。
もちろん、最も簡単な解決策は、データベースから目的のタイプのすべてのエンティティを取得し、一致しないエンティティをループして削除することでそのリストをメモリ内にフィルタすることです。しかし、パフォーマンスが最適ではないことは明らかです。特に、エンティティがdbを増やす場合は特にそうです。
提案
だから私の考えは、JPAの述語クラスを考え、永続化技術、特定の基準に私の仕様を翻訳する「ConversionManager」を作成することです。サービスは次のようになります。
管理者を使用することで、ユーザーは独自の変換ロジックを登録し、ドメイン関連の仕様を永続固有のロジックから分離することができます。私たちのマネージャの設定を最小限に抑えるために、私はコンバータクラスでアノテーションを使い、マネージャがそれらのコンバータを自動的に登録できるようにしたいと思います。
JPAリポジトリの実装では、依存関係インジェクションを使用して自分のマネージャを使用して、検索方法を提供することができます。仕様による検索を提供すると、リポジトリインタフェース上のメソッドの数が大幅に削減されるはずです。
理論的には、これはすべてうまく聞こえますが、私は何か重要なものが欠けているように感じます。あなたは私の提案について何を考えますか、それはDDDの考え方に従っていますか?あるいは、私が今説明したものと全く同じことをするフレームワークがすでに存在していますか?
人々は、Javaが過度のエンジニアリングのために悪いラップを取得する理由を悩んでいる... – GreenieMeanie
そして、あなたは接続詞(論理AND)を持つときにどのように状況を処理するのですか?どのように複数の仕様をクエリに変換しますか? – dzieciou