Unit of Work パターンについて
Unit of Work とは
データに変更があったとき、データベースにデータをcreate, update, remove しなければならない。
しかし1変更ごとに毎回データベースに書き込みをしていては、処理が遅くなってしまうケースがある。
その上DBトランザクションを必要とするケースもある。
しかも複数のリクエストをまたいで、トランザクションを実現したい場合はDBトランザクションでは不十分である。
オブジェクトをcreate, change, deleteする際に、まずUnit of Workに対してそれを伝える。
ここから重要な点。
commitをするタイミングになったら、何をするかはUnit of Workが決める。
たとえば
- トランザクションを開く
- concurrencyチェックをする(Pessimistic Ofline Lock, Optimistic Offline Lock)
- DBに変更を書き込む。
等である。
Microsft のブログから引用
Unit of Work クラスには、エンティティに変更済み、新規、または削除済みというマークを付けるメソッドを用意します (多くの実装では、Unit of Work 自体に変更されたエンティティを自動的に判別するなんらかの手段があるので、MarkDirty を明示的に呼び出す必要はありません)。Unit of Work には、すべての変更をコミットまたはロールバックするメソッドも作成します。
ある意味、Unit of Work はすべてのトランザクション処理コードを詰め込む場所と考えることができます。Unit of Work では次のようなことを行います。
トランザクションの管理。
データベースの挿入、削除、更新の指示。
重複更新の防止。Unit of Work オブジェクトを 1 回使用するコードの内部で、複数箇所で同じ Invoice オブジェクトが変更済みとマークされる場合がありますが、Unit of Work クラスがデータベースに UPDATE コマンドを発行するのは 1 回だけです。
Unit of Work パターンを使用することの利点は、コードの他の部分がこれらの処理から解放されて、ビジネス ロジックに集中できることです。
Unit of Work によるこの方法を使用すると、IInvoiceCommand の異なる実装をうまく組み合わせて請求システムのビジネス ルールを追加または削除しながら、トランザクションとしての整合性を保つことができます。
Ref