1

Repository と UnitOfWork のパターンを正しく実装したかどうか 100% 確信があるわけではありませんが、これがどのように機能するかはわかりません。

たとえば、Apple と Orange という 2 つのオブジェクトがあります。

Apple は、次のように OrangeID を介して Orange に参加しています。

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

新しい Apple と新しい Orange を作成し、ID リンクを適切に設定したいと考えています。しかし、私には問題があります。Orange をデータベースに保存するまで、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() が適切な値を割り当てる必要がありますか?

ヘルプ/ヒントをいただければ幸いです。ダンカンに感謝します

4

1 に答える 1

1

まず、これを Apple エンティティと Orange エンティティの間の関係として見ることはできません。Apple が OrangeID という数値属性を持っているだけです。コードは次のようになります。

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

次に、データベース関係が正しく確立されているかどうかを確認できます。したがって、作業単位の実装が機能するかどうかの証拠はありません。

さらに, 利用可能な実装がたくさんあります. 時間を節約したい場合.

ただし、私はすでに車輪を再発明しており、私の実装を使用しています:)

のぞき見したい場合は、google code: ws-helpersプロジェクトでホストされています。これは実際には以前のプロジェクトの一部だったので、スタンドアロン プロジェクトとして作成するには時間が必要です。

確かに、最も有名な実装は Rhino-Tools/UnitOfWork です。しかし、Rhino-Tools では現在のユニットが常に 1 つしかないのに対し、それぞれ別のトランザクションで必要な数のユニットを作成できるので、私は私のほうが好きです。しかし、現在の実装のスレッドセーフについてはまだわかりません。

于 2009-08-03T16:25:09.530 に答える