2009-04-15 6 views
4

私はインピーダンスのミスマッチに悩まされるかもしれませんが、私はIRepositoryと不変オブジェクトで見た例を調整しようとしています。リポジトリと不変オブジェクト?

私は、hundrdsのWebリクエストが「ワーキングセット」の製品で動作するカタログアプリケーションに取り組んでいます。カタログ全体のサブセットは、任意の時点で再生される傾向があります。

同時に、私たちのデータチームは絶えず製品データを更新するが - など新しい画像、更新価格、説明、など

パフォーマンスのために、私は不変として、製品を検討したほうだと私には思えます。それらはリポジトリによってロードおよびキャッシュされ、多くのスレッドが同じ製品オブジェクトに同時にアクセスできます。

しかし、このアイデアは、私がUpdate/Deleteメソッドで見たIRepositoryの例の多くで壊れているようです。スレッドが製品に書き込めるとすぐに、自分自身がレースやその他の不快感を感じるようです。

私はエンティティの変更がコンパニオンエディタオブジェクトを介して行われる「エディタ」モデルを構想しました。このオブジェクトは変更を維持し、問題の製品を誰もが使用できるように再読み込みするよう強制します。製品は決して変更されず、外部でのみ「編集」され、再ロードされます。

これは意味がありますか?私は彼らが記述したように、これはリポジトリで動作することができますか?

ありがとうございました!

答えて

4

リポジトリは、データの取得/保存のみを担当します。新しいオブジェクトを作成するのは、ファクトリです。

あなたの場合、不変のオブジェクトは問題ありません。ただし、超大型製品を無効にしてリポジトリキャッシュから削除する方法が必要です。ぶら下がった参照は、検索時に有効であったため、ほとんどの場合無視されます。

製品のアップデートの場合は、工場で新しい製品を作成する必要があります。リポジトリには、Retrieve(またはFind)、Save、およびSupersedeの3種類の操作しか含まれません。保存場所は変更されていない新しい製品を保存します。また、Supersedeは新製品を保管し、古いものを無効にしてキャッシュから削除します。私は2つの保存方法は、以下の外観を取るために想像できるC#の署名の面では

void Save(Product product); 

void Supersede(Product oldProduct, Product newProduct); 

私はこのことができます願っています。

+0

おそらくマイケル・ハレンが提案した「編集ロック」を持つこの方法は、行く方法です - 本当にありがとう! – n8wrl

+0

私は実際に製品のデータベースレコードを更新するかどうかはわかりません。製品の履歴を保持する必要がある場合は、置き換える方が理にかなっている可能性があります。 – grover

1

排他的/悲観的か簡単なロックを実行できないほど高い並行性またはパフォーマンス要件がありますか?optimistic

関連する問題