2017-06-03 8 views
1

私はこの質問が何度か前に尋ねられたことを知っていますが、私が探していた答えを得ることができませんでした。 私はリポジトリ(汎用)とUOWパターンを実装していますので、EFを使用して自分のDBにアクセスできます。 UnitOfWorkクラスの一部です:Unit Of WorkパターンでDisposeを正しく使用するにはどうすればいいですか?

protected virtual void Dispose(bool disposing) 
    { 
     if (!disposed) 
     { 
      if (disposing) 
      { 
       entities.Dispose(); 
      } 
     } 
     this.disposed = true; 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

質問:誰がvoidを呼び出すのですか?私はその方法の使用法の例を見ていません。この権利は

private BDEntities entities = null; 

    public UnitOfWork() 
    { 
     if (entities == null) 
     { 
      entities = new BDEntities(); 
     } 
    } 

です:

これは、ワーク・クラス単位の上部をそれ? 「使用する」を使うべきですか? 「はい」の場合、なぜDisposeメソッドが必要なのですか?

私は、適切かつ簡単な使用法の例を教えていただけますか?

は、ありがとう UOWは通常、依存性注入とAutofacのような依存性注入コンテナと一緒に使用されているのでロテム

答えて

1

あなたが処分を呼び出す人について任意の例に遭遇していない理由はあります。この場合、オブジェクトを作成して後で破棄するのがこのコンテナの役割です。確かに、これはUoWを使用する唯一の方法ではありませんが、一般的なパターンです。

あなたの質問に答えるには:あなたが取っているアプローチは多かれ少なかれ正しいと思います。 UoWクラスはコンテキストをラップするクラスである必要があります。したがって、それを破棄するクラスでなければなりません(本質的に、DbContext自体はUoWです)。

しかし、Disposeメソッドを単純化することはできます。無

public void Dispose() 
{ 
    entities.Dispose(); 
} 

(なしDispose方法:あなたが(ポインタのような)任意の管理対象外としませIDisposableリソースを持っていないので、UOWのDisposeメソッド内のコンテキストのDisposeメソッドを呼び出すことは完全に十分ですSuppressFinalizeコール)。

はい、あなたは絶対にusingを使用する必要があります。そしてそれはまさにあなたがDispose()メソッドを必要とする理由です。 IDisposableを実装する型のオブジェクトのみをusingブロックで使用できます。 useブロックを書く場合、基本的にtry-finallyブロックに変換されます。 usingブロック内のコードがtryブロックに入り、最後にDispose()が呼び出されます。

+0

ありがとうございます! したがって、基本的に、メソッドは次のようになります。 if(entities == null) { (entities = new BSODEntities()){}; } と私は本当に "使用して"それをカプセル化するので、Disposeメソッドが本当に必要ない?右? –

+0

はい、基本的にどのように使うべきかと思います。 Dispose()メソッドについては、使用ブロックを使用している場合は、オブジェクトの処理が完了した時点で明示的に呼び出す必要はありません。しかし、あなたのクラスでそれを実装する必要があるので、それはusingブロックからのそのカプセル化された呼び出しによって呼び出すことができます。 –

関連する問題