2016-04-19 20 views
1

Ich habe eine Klasse mit einer Methode einige Datenbankaktionen durchführen.
Ich möchte zulassen, dass ein bestehender (offener) Kontext im Methodenaufruf für den Datenbankzugriff gesendet wird.
Wenn jedoch kein Kontext gesendet wird, erstelle ich einen neuen.Wird beim Erstellen eines Verweises auf ein bestehendes Objekt entsorgt?

Ich möchte nur sicherstellen, dass das Objekt nicht entsorgt wird, wenn es im Methodenaufruf enthalten ist.

Wird das Objekt entsorgt, wenn in der aufgerufenen Methode ein using-scope verwendet wird?

// DbService class 
class DbService 
{ 
    private void SomeDbAction(SomeDbContextObject backendContext = null) 
    { 
     using (var context = backendContext ?? CreateNewContextObject()) 
     { 
      // Some actions using the context 
     } 
    } 
} 


// Call from another class 
class Temp 
{ 
    void DoSomeThing() 
    { 
     var existingContext = new SomeDbContextObject(); 
     dbService.SomeDbAction(existingContext); 
     // Is dbService disposed here? 
     UseContextForSomethingElse(existingContext); 
    } 
} 
+1

Wird dbService hier entsorgt? Ja, das 'using' Statement zu verlassen, kümmerte sich darum. – spender

+1

'using' ruft' Dispose() 'auf. Wenn Sie nicht möchten, dass 'Dispose()' aufgerufen wird, verwenden Sie keine Anweisung 'using'. –

+0

Dispose wird aufgerufen, wenn Sie die schließende Klammer der using-Anweisung erreichen, da Sie keine automatische Entsorgung wünschen, entfernen Sie einfach die using-Anweisung und führen Sie sie manuell mit existenderContext.Dispose aus, wenn Sie bereit sind – MikeT

Antwort

9
// Is dbService disposed here? 

Ja, es angeordnet ist. Dies ist ein Fall, in dem optionale Argumente gegen Sie arbeiten - besser zwei spezifische Überlastungen haben:

class DbService 
{ 
    public void SomeDbAction(SomeDbContextObject backendContext) 
    { 

      // Some actions using the context 

    } 
    public void SomeDbAction() 
    { 
     using (var context = CreateNewContextObject()) 
     { 
      SomeDbAction(context); 
     } 
    } 
} 
2

Sie sollten nicht dispose des backendContext Objekt, wenn es in geben wurde, sollte aber so tun, wenn Sie erstellt es in der Methode:

private void CoreSomeDbAction(SomeDbContextObject backendContext) { 
    //TODO: Some actions using the context 
} 

private void SomeDbAction(SomeDbContextObject backendContext = null) { 
    if (null == backendContext) { 
    // created context should be disposed 
    using (SomeDbContextObject context = new SomeDbContextObject(...)) { 
     CoreSomeDbAction(context); 
    } 
    } 
    else 
    CoreSomeDbAction(backendContext); // passed context should be prevent intact 
} 
Verwandte Themen