2016-04-01 4 views
1

Ich habe eine neue asp.net mvc-5 Web-Anwendung mit Visual Studio 2013 erstellt und ich meine Datenbanktabellen mit Entity Framework 6, die generiert eine .edmx Datei. Dann habe ich eine neue Controller-Klasse erstellt. Ich überprüfte den generierten Code für die neue Controller-Klasse, und ich finde, dass ich am Ende der Controller-Klasse die folgende bekam die aktuelle HTTP-Anforderung für die Entsorgung: -Wie kann ich sehen, was in der "abstrakten Klasse Controller" für Dispose-Methode abgedeckt ist

protected override void Dispose(bool disposing) 
     { 
      if (disposing) 
      { 
       db.Dispose(); 
      } 
      base.Dispose(disposing); 
     } 

jetzt weiß, dass ich die folgenden Fakten über die aktuelle Entsorgung http-Anforderung: -

  1. Die obige Dispose() - Methode überschreibt die Dispose-Methode in der Controller-Basisklasse. und diese Dispose-Methode wird am Ende der HTTP-Request-Behandlung aufgerufen.

  2. Die obige Dispose() - Methode wird die aktuelle db-Verbindung entfernen und dann die Dispose() -Methode innerhalb der Controller-Basisklasse aufrufen.

aber ich habe folgende Fragen: -

  1. als ich versuchte, die Basis dispose-Methode Zugriff auf "Gehe zu Definition" verwendet wird, wie folgt: -

enter image description here

Ich wurde innerhalb der abstrakten Klasse umgeleitet, mit leeren Methodenimplementierung für Dispose(). So gibt es eine Möglichkeit, die Implementierung für t kennen er dispose Methode innerhalb der Controller-Basisklasse?

  1. auf einigen Online-Tutorials sie die folgende Methode in der Dispose-Methode aufrufen: -

    GC.SuppressFinalize (this);

so bin ich nicht sicher, ob dieser Teil der Standardimplementierung für die Dispose() Methode in der Controller-Basisklasse ist, oder ich muß explizit in der Dispose-Methode der Müllsammler nennen?

Dank

bearbeiten hier ist der öffentliche Code-Controller abstrakte Klasse, wo die dispose-Methode leer ist: -

enter image description here

Antwort

0

Sie einen Blick auf the code for Controller nehmen und für die Entsorgung suchen Methode, die genau das ist:

 public void Dispose() 
     { 
      Dispose(true /* disposing */); 
      GC.SuppressFinalize(this); 
     } 
+0

Warum wird dieser Code nicht im Visual Studio angezeigt? Muss ich diesen Code in meinem aktuellen Projekt bereitstellen? Jetzt befindet sich die System.Web.Mvc.Controller-Klasse im folgenden Verzeichnis: "C: \ Benutzer \ ***** \ AppData \ Local \ Temp \ 14384 $ System.Web.Mvc.dll $ v4.0.30319 $ NoDynamic" aber seine Methoden sind leer .. –

+0

so wird der Code für die Controller-Klasse innerhalb der Link, die Sie bereitstellen, nicht standardmäßig in jedem neuen asp.net mvc-Projekte sein? –

+0

Kannst du bitte darüber beraten? –

1

Sie sollten diesen Artikel Dispose Pattern Artikel auf Microsoft lesen, es geht durch alle Empfehlungen sowie Does und Donts.

.... Gibt es eine Möglichkeit, die Implementierung für die dispose-Methode in der Controller-Basisklasse zu kennen?

Die MVC Controller Art eine tatsächliche Implementierung nicht für Dispose haben aber einen Platzhalter für Ihren Code in Form einer virtuellen Methode, die Sie überschreiben können, bietet.

/// <summary> 
/// Releases all resources that are used by the current instance of the <see cref="T:System.Web.Mvc.Controller"/> class. 
/// </summary> 
public void Dispose() 
{ 
    this.Dispose(true); 
    GC.SuppressFinalize((object) this); 
} 

/// <summary> 
/// Releases unmanaged resources and optionally releases managed resources. 
/// </summary> 
/// <param name="disposing">true to release both managed and unmanaged resources; false to release only unmanaged resources.</param> 
protected virtual void Dispose(bool disposing) 
{ 
} 

.. auf einigen Online-Tutorials sie die folgende Methode in der Dispose-Methode aufrufen: GC.SuppressFinalize(this). so bin ich nicht sicher, ob dieser Teil der Standardimplementierung für die Entsorgung ist() ...

Nein, sollten Sie nur diese nennen, wenn Sie tatsächlich mit unmanaged Code/Speicher direkt in dem Fall arbeiten Sie sollten einen Finalizer implementieren oder ein Safehandle für Ihren Typ verwenden, um sicherzustellen, dass der nicht verwaltete Speicher freigegeben wird. Siehe auch die Microsoft-Dokumentation unter GC.SuppressFinalize. Im Falle des Typs MVC Controller ist es bereits für Sie angerufen, so dass Sie es nicht erneut hinzufügen müssen.

Der Aufruf GC.SuppressFinalize stellt sicher, dass, wenn ein Typ hat eine Finalizerthread und ist Einweg (IDisposable implementiert), dass es nicht auf die nächste Generation in der Garbage Collector gefördert wird, die es länger für eine Weile bleiben, um macht, nach der die Finalizerthread Wird aufgerufen, wenn die Generierung von Objekten freigegeben wird. Es teilt dem Garbage Collector mit, dass das Objekt bereits bereinigt wurde und der Finalizer nicht ausgeführt werden muss. Fahren Sie also fort und geben Sie den gesamten Speicher frei, der diesem Objekt zugeordnet ist. Auch wenn Sie kein Finalizer für das Objekt haben, ist dies nicht notwendig, da GC das Objekt beim Ausführen nicht zur nächsten Generation hochstufen sollte.

+0

@lgor Sie meinen also, dass meine Controller-Basisklasse keine Implementierung für die Dispose() -Methode hat? so ruft derzeit die Basis. Dispose (Disposing) in meinem Controller ist meangless? –

+0

@JohnJohn - Es hat eine Implementierung, die dann zurück auf die virtuelle geschützte Methode 'Dispose (bool disposing)' ruft, die Sie dann in Ihrem Code implementieren können. Ich füge diese Methode auch in meiner Antwort hinzu (2 Sekunden). – Igor

+0

@lgor so der Code in diesem Link für die Basis-Controller-Klasse zeigen http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/Controller.cs gibt es nicht in jedem neuen Projekt? Seltsam? Ich denke, dass der Code in diesem Link bereits in der Base-Controller-Klasse sein wird? –

Verwandte Themen