4

StoreFrontのようなリポジトリパターンを使用するいくつかの例を見て、どこがcontext.Dispose()呼び出されているのかわかりませんでしたか?データコンテキストを破棄すると、メモリリークが発生しませんか?それとも、アプリケーションの存続期間中、各リポジトリに対して1つのデータコンテキストだけですか?

4

3 に答える 3

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ステートメントがコンパイラーによって変換される方法です。以前のコード例は、コンパイル時に次のコードに拡張されます(オブジェクトの限定されたスコープを作成するための余分な中括弧に注意してください)。

于 2012-06-15T12:50:31.903 に答える
1

コンテキストオブジェクトとは、 EntityFrameworkまたはLinq2SqlDataContextによって作成されたオブジェクトを意味すると思います。実際には、通常、ステートメントで実装するクラスをラップするか、直接呼び出す必要がありますが、これらのデータコンテキストオブジェクトの場合、これは実際には必要ありません。IDisposableusingDispose()

これは、 StephenWaltherによって書かれた優れた投稿です。

したがって、DataContextオブジェクトでDispose()を呼び出すことによる大きなメリットは実際には得られません。唯一のわずかな利点は、Dispose()メソッドがいくつかのオブジェクトをnullに設定して、ガベージコレクターが早期に収集できるようにすることです。アプリケーションで使用されるすべてのバイトについて心配する場合、またはDataContextで膨大な数のオブジェクトを追跡する場合を除いて、DataContextオブジェクトのメモリオーバーヘッドについてはあまり心配しません。

于 2012-06-15T13:13:53.350 に答える
0

DIを使用している場合は、アイテムのライフサイクルを管理できます。これがNinjectの例です

kernel.Bind<ProjectAdapter.INIT1_DEVEntities>()
              .ToSelf()
              .InRequestScope()
              .WithConstructorArgument("connectionString",
            ctx => ctx.Kernel.Get<string>("efString"))
于 2012-06-15T13:15:48.627 に答える