6
ための複数の呼び出しを処理するために、C#で、私のリポジトリ(DDD)を実装する必要があり

私のプロジェクトでどのようなクラスは、のために2つのインスタンスを作成しないように集計ルーツがすでに作成されているのを追跡するための責任を負うべき同じエンティティ。私のリポジトリは、作成したすべての集約のリストを保持する必要がありますか?はいの場合、どうすればいいですか?シングルトンリポジトリを使用していますか(私には正しいとは言えません)?もう1つのオプションは、この "キャッシング"を別のクラスにカプセル化することでしょうか?このクラスはどんなパターンで、どんなパターンでフィットするでしょうか?どのように私は同じ集計ルート

O/Rマッパーを使用していないので、それを処理するテクノロジがある場合は、どのように使用するかを知る必要がありますそれは

ありがとう!

答えて

3

私はあなたのアイデンティティ・マップパターン、as described by Martin Fowlerを考えていると信じています。

Fowlerは、彼の本の中の完全な記述で、読み書きのエンティティ(トランザクションに参加するエンティティ)と読み込み専用の参照データ(理想的には一度だけ読み出す必要があるメモリにキャッシュされます)。

(「ファウラー・アイデンティティ・マップ」を探してください)私は彼の優秀な本を取得する提案が、このパターンを説明抜粋では、Googleブックスで読み取り可能です。

基本的には、アイデンティティ・マップが格納は、ハッシュテーブルの例えば、エンティティ・オブジェクトがデータベースからロードされたオブジェクトです。マップ自体は、現在のセッション(要求)のコンテキストに、好ましくは作業ユニット(読み取り/書き込みエンティティ用)に格納されます。読み取り専用エンティティの場合、マップはセッションに結びつける必要はなく、プロセスのコンテキスト(グローバル状態)に格納することができます。

+0

私はその本を所有しています。それが合っているかどうかを確認するアイデンティティマップを見ていきます。ありがとう – Mark

1

キャッシングは、リポジトリではなくサービスレベルで行われるものと考えています。リポジトリは "ダム"で、基本的なCRUD操作を行うだけです。サービスは、必要に応じてキャッシュで作業するほどスマートになります(これは、おそらく低レベルのデータアクセスルールよりもビジネスルールの方が大きくなります)。

簡単に言えば、リポジトリを直接使用するコードはありません。サービスでのみ行うことができます。それ以外のものはすべて、インタフェースとして関連するサービスを消費します。これは、ビズ・ロジック、キャッシングなどを入れるためにあなたに素敵なラッパーを提供します

+0

同じ集約の2つの呼び出しがリポジトリの同じインスタンスに対して行われた場合、同じ集約の2つの別々のインスタンスが作成されて返されますか? – Mark

+0

はい、これらの呼び出しは、必要に応じて集約のインスタンスをキャッシュするサービスを経由する必要があります。したがって、この場合、サービスはリポジトリを一度呼び出すだけで、2回目のリクエストでキャッシュから戻ってくるだけです。 –

+0

しかし、この質問を参照してください - http://stackoverflow.com/questions/3442102/repository-pattern-caching - いくつかの人々は別の意見があります。私は、ビジネス上の懸念の一種としてキャッシュを扱いたいので、リポジトリの依存性はほとんどありませんが、誰もそれをそのように見なすわけではありません。 –

0

私が言う、もしあなたは懸念が漏れるせているリポジトリ以外の場所で管理この「キャッシュ」。

リポジトリは、アイテムのコレクションです。リポジトリを消費するコードでは、オブジェクトをリポジトリから取得するか、別の場所から取得するかを決定する必要があります。

シングルトンは間違った寿命のように聞こえます。おそらくリクエストごとに行うべきです。 IoC/DIコンテナを使用している場合は、これを簡単に管理できます。

それはあなたも同じ集計証拠のための複数の呼び出し建築/設計上の問題を検討しているという事実のように思えます。私は、これらの第1および第2の呼び出しが何であるかの例と、ARの同じインスタンスを必要とする理由の例を聞くことに興味があります。

関連する問題