2009-08-03 28 views
1

リポジトリとUnitOfWorkのパターンを正しく実装しているとは100%は確信していませんが、それ以外の仕組みはわかりません。UnitOfWorkのパターンとアトミック操作

たとえば、AppleとOrangeの2つのオブジェクトがあります。 AppleはそのようOrangeIDを経てオレンジに接合されている

は:

public class Apple 
{ 
    public int OrangeID { get; set; } 
} 

私は新しいAppleと新しいオレンジを作成したい、と私は適切なIDのリンクを設定したいです。しかし、私は問題があります。オレンジをデータベースに保存するまで、私はOrangeIDを知らないだろう。

これは、私は次のようになります意味:

var unitOfWork = new UnitOfWork(); 
Orange newOrange = new Orange(); 
OrangeRepository.Insert(newOrange); 
unitOfWork.Commit(); 

//newOrange will have been updated with the actual ID 
Apple newApple = new Apple(newOrange.ID); 
etc... 

私は上記の外に座っているトランザクションを持っていない限り、これは、アトミック操作ではありません。しかし、私はそれがUnitOfWorkが扱うはずだったと思ったのですか?または、私のUnitOfWork.Commit()は、データベースに書き込むときに適切な値を割り当てる必要がありますか?

すべてのヘルプ/ヒントをいただければ幸いです、 おかげ ダンカン

答えて

1

まず、私はアップルとオレンジのエンティティ間の関係としてこれを見ることができません。 Appleには、OrangeIDという数値属性があります。あなたのコードは次のようになります:

Apple apple = new Apple(newOrange); 
AppleRepository.Insert(apple); 
unitOfWork.Commit(); 

次に、db関係が正しく設定されているかどうかをチェックします。 これで、作業単位の実装が有効かどうかは証明できません。

さらに、いくつかの時間を節約したい場合は、多くの利用可能な実装があります。 ws-helpersプロジェクト:私はすでに、車輪を再発明し、あなたはそれがGoogleのコード上でホストされているのぞき見を持っているしたい場合は、私は私:)

の実装を使用する、が

。これは実際には以前のプロジェクトの一部だったので、これをスタンドアロンプ​​ロジェクトとする時間が必要です。

確かに、最も有名な実装はRhino-Tools/UnitOfWorkです。 しかし、私は私が好きなだけ多くのユニットを作成することができます。なぜなら、それぞれが別々のトランザクションを持ち、Rhino-Toolsでは常に現在のユニットが1つだけです。しかし、私は現在の実装のスレッドセーフについてはまだ分かりません。

関連する問題