リポジトリーを実装します。リポジトリーのコンシューマーはいくつかの操作を実行でき、それらを一度にコミットしたいので、UOWパターンを使用したいと思います。
問題に関するいくつかの記事を読んだ後、この2つの要素を関連付ける方法がまだわかりません。それは、他の方法で行われている記事によって異なります。
時々、UOWはリポジトリの内部にあるものです:
public class Repository
{
UnitOfWork _uow;
public Repository()
{
_uow = IoC.Get<UnitOfWork>();
}
public void Save(Entity e)
{
_uow.Track(e);
}
public void SubmittChanges()
{
SaveInStorage(_uow.GetChanges());
}
}
そして時にはそれは外部です:
public class Repository
{
public void Save(Entity e, UnitOfWork uow)
{
uow.Track(e);
}
public void SubmittChanges(UnitOfWork uow)
{
SaveInStorage(uow.GetChanges());
}
}
また、リポジトリを参照するUOWもいます。
public class UnitOfWork
{
Repository _repository;
public UnitOfWork(Repository repository)
{
_repository = repository;
}
public void Save(Entity e)
{
this.Track(e);
}
public void SubmittChanges()
{
_repository.Save(this.GetChanges());
}
}
これら2つの要素はどのように関連していますか? UOWは変更が必要な要素を追跡し、リポジトリにはそれらの変更を永続化するロジックが含まれていますが、誰が誰を呼び出すのですか?最後はもっと意味がありますか?
また、誰が接続を管理していますか?リポジトリで複数の操作を実行する必要がある場合、同じ接続を使用し、トランザクションの方がより健全であると思うので、UOW内に接続オブジェクトを配置すると、リポジトリ内の接続オブジェクトも理にかなっています。
乾杯
Re:「UOWは変更が必要な要素を追跡し、リポジトリにはそれらの変更を永続化するロジックが含まれていますが、誰が誰を呼び出すのですか?」
これらのクラスの基本的な責任を理解している。あなたが読んだ各記事は、それらをさまざまな方法で結びつけていると言います。これは、「だれが誰を呼ぶか」についての決定はあなた次第であることを意味します。
Cohesion、Decoupling、Reusability、Unit-Testabilityなど.
引用するには Eric Evans Domain Driven Design、(2004)Addison Wesley、pg 69 :
[レイヤードアーキテクチャの]基本的な原則は、レイヤーの要素は、同じレイヤー内の他の要素またはその「下」のレイヤーの要素にのみ依存するということです。
私の意見では、UOWとRepoは、明確で独立した責任を持つ2つの非常に異なるクラスです。まず、もう一方を呼び出さないようにします。
3番目のclientクラス(つまり、controller
またはservice class
)そのreallyは、リポジトリから「いつ、何を取得するか」と「いつ」トランザクションを保存するかを知っています。このクライアントはアーキテクチャの比較的高い位置にあり(より多くのクラスについてknowできるため)、2つの間のオーケストレーションを行うことができます。
--------------------------------
[Client]
/ \
----------/---- \---------------
/ \
V V
[Unit Of Work] [Repo]
--------------------------------
メソッドは、最も一般的にはUOWインターフェース(通常はファクトリーを介して構築される)に与えられます。
通常、コマンドパターンクラス/ファサードからUOWインターフェイスのメソッドを呼び出します。 UOWは単にデータベースIOを後で延期するだけなので(長時間のトランザクションやデータベースへの複数の呼び出しが不要になるのを防ぐため)、UOWの操作は通常と同じレベルにする必要があります。データベースを操作します。
MicrosoftはUOWパターンに関して非常に徹底的な投稿をしています。