StoreFrontのようなリポジトリパターンを使用するいくつかの例を見て、どこがcontext.Dispose()
呼び出されているのかわかりませんでしたか?データコンテキストを破棄すると、メモリリークが発生しませんか?それとも、アプリケーションの存続期間中、各リポジトリに対して1つのデータコンテキストだけですか?
3 に答える
実行する必要のあるステートメントを使用している場合using
、呼び出しはインターフェースを実装するときに自動的に破棄されIDisposable
ます。
そのような:
public int GetThingCount()
{
using (MyDataContext context = new MyDataContext()) // context is created here
{
return context.Things.Count();
} // it is automatically disposed of here even in the event of an exception
}
http://msdn.microsoft.com/en-us/library/yh598w02.aspx
原則として、IDisposableオブジェクトを使用する場合は、usingステートメントで宣言してインスタンス化する必要があります。usingステートメントは、オブジェクトのDisposeメソッドを正しい方法で呼び出します。また、(前に示したように使用する場合)、Disposeが呼び出されるとすぐに、オブジェクト自体もスコープ外になります。usingブロック内では、オブジェクトは読み取り専用であり、変更または再割り当てすることはできません。
usingステートメントは、オブジェクトのメソッドの呼び出し中に例外が発生した場合でも、Disposeが呼び出されるようにします。オブジェクトをtryブロック内に配置し、finallyブロックでDisposeを呼び出すことで、同じ結果を得ることができます。実際、これはusingステートメントがコンパイラーによって変換される方法です。以前のコード例は、コンパイル時に次のコードに拡張されます(オブジェクトの限定されたスコープを作成するための余分な中括弧に注意してください)。
コンテキストオブジェクトとは、 EntityFrameworkまたはLinq2SqlDataContext
によって作成されたオブジェクトを意味すると思います。実際には、通常、ステートメントで実装するクラスをラップするか、直接呼び出す必要がありますが、これらのデータコンテキストオブジェクトの場合、これは実際には必要ありません。IDisposable
using
Dispose()
これは、 StephenWaltherによって書かれた優れた投稿です。
したがって、DataContextオブジェクトでDispose()を呼び出すことによる大きなメリットは実際には得られません。唯一のわずかな利点は、Dispose()メソッドがいくつかのオブジェクトをnullに設定して、ガベージコレクターが早期に収集できるようにすることです。アプリケーションで使用されるすべてのバイトについて心配する場合、またはDataContextで膨大な数のオブジェクトを追跡する場合を除いて、DataContextオブジェクトのメモリオーバーヘッドについてはあまり心配しません。
DIを使用している場合は、アイテムのライフサイクルを管理できます。これがNinjectの例です
kernel.Bind<ProjectAdapter.INIT1_DEVEntities>()
.ToSelf()
.InRequestScope()
.WithConstructorArgument("connectionString",
ctx => ctx.Kernel.Get<string>("efString"))