リポジトリと作業ユニットの関係


17

リポジトリを実装します。リポジトリのコンシューマは複数の操作を実行でき、一度にコミットしたいので、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内に配置し、リポジトリ内のこのオブジェクトも同様に意味があります。

乾杯


回答:


7

Re:「UOWは変更が必要な要素を追跡し、リポジトリにはこれらの変更を保持するロジックが含まれていますが、誰が誰を呼び出すのですか?」

これらのクラスの基本的な責任を理解しています。あなたは、あなたが読んだ記事のそれぞれが、それらを異なる方法で結びつけていると言います。これは、「誰が誰を呼び出すか」についての決定はあなた次第であることを意味します。

CohesionDecoupleReusabilityUnit-Testabilityなどの優れたソフトウェア設計の基本原則に導かれながら、「レイヤー」の観点から問題をスケッチしようと思います。

Eric Evans Domain Driven Design、(2004)Addison Wesley、pg 69を引用するには:

[階層化アーキテクチャ]の本質的な原則は、レイヤーの要素は同じレイヤー内の他の要素またはその「下にある」レイヤーの要素にのみ依存するということです。

私の意見では、UOWとRepoはどちらも明確で独立した責任を持つ2つの非常に異なるクラスです。そもそも、もう一方を呼び出さないようにします。

リポジトリから「いつ、何を取得するか」、トランザクションを保存する「いつ」を本当に知っている3番目のクライアントクラス(controllerまたはservice class)が必要だと思います。このクライアントは、アーキテクチャ内の比較的高い位置にあるため(より多くのクラスについて知ることができます)、2つの間のオーケストレーションを行うことができます。

--------------------------------

         [Client]
           /   \
----------/---- \---------------
         /       \
        V         V
[Unit Of Work]  [Repo]


--------------------------------

2

メソッドは、通常、UOWインターフェイス(通常はファクトリを介して構築されます)に与えられます。

通常、コマンドパターンクラス/ファサードからUOWインターフェイスのメソッドを呼び出します。UOWは単純にデータベースIOを後まで延期するため(長時間実行されるトランザクションや不要なデータベースへの複数の呼び出しを防ぐため)、UOWでの作業は通常データベースで作業するのと同じレベルである必要があります。

MicrosoftはUOWパターンに関する非常に徹底的な投稿をしています:

http://msdn.microsoft.com/en-us/magazine/dd882510.aspx

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.