作業単位は、DbContextの範囲をカバーします。これは、リポジトリのクラスとコントローラに注入可能な依存関係として設計されています。依存関係注入は、クラスがコンストラクタまたはプロパティを介して依存するサービスの参照を受け入れるためのパターンです。彼らはお互いに排他的ではなく、むしろ作業ユニットを使用することは、依存性注入によって補完されるパターンです。
クラスによって使用される依存関係を管理し、それらの依存関係のライフタイム範囲を管理するには、AutofacやUnityのようなInversion of Controlコンテナを使用します。たとえば、MVCやWeb APIの場合、IoCコンテナは、リクエスト単位で作業ユニットのような依存関係を提供するように設定されます。 (それぞれの要求に作業ユニットの別のインスタンスが発行されることを意味します)
作業ユニットをもう少し制御したい場合は、EF6に推奨する実装はMehdiのDbContextScopeパターンです。 (http://mehdi.me/ambient-dbcontext-in-ef6/)このパターンでは、ContextScopeFactoryとContextScopeLocatorを依存関係に挿入し、ファクトリを使用してコンテキストスコープ(作業単位)を作成し、リポジトリはロケータを使用してその作業単位を見つけることができます。これにより、using()ブロックを使用して、作業単位をより細かく制御することができます。
しかし、MicrosoftはEF6で使用する作業単位を推奨していないと聞いていますか?これは本当ですか? EF6ではUOWを破棄する必要がありますか? – user9966
私はこれについて言及していると聞いたことがありますが、作業単位を使用すべきであることを示す文書は見ていません。 DbContextはトランザクションを管理し、トランザクションスコープ内で作業することができるため、別の作業単位の実装が必要かどうかを疑うかもしれません。しかし、テスト能力の面では、作業パターンの単位を採用すると、DbContextやトランザクションスコープよりもモックアウトが容易になることがわかります。 –