2015-04-22 20 views
5

Kürzlich hatte ich eine Diskussion mit einem Kollegen darüber, ob ein Repository in einer Webanwendung (in diesem Fall eine Ebene über Entity Framework) als statische oder nicht statische Klassen implementiert werden sollte.Repository als statische oder nicht statische Klasse?

In dieser Frage bin ich nicht interessiert, ob die eine oder andere Implementierung ein besseres (OOP) Design ist, denn das würde die Antworten subjektiv machen.

Was mich interessiert: Instantiiert und entsorgt das Entity Framework DbContext in der CLR anders, wenn Sie die statische mit der nicht statischen Klasse vergleichen? Ich bin speziell an Multithreading-Problemen und Speichernutzung interessiert, da dieser Code in einer MVC-Webanwendung ausgeführt wird.

Bearbeiten: Nur um zu verdeutlichen: Ich bin nicht interessiert an der Entsorgung oder Garbage Collection der Repository-Klasse, was passiert nur mit der lokalen Variable. Ist es korrekt zu sagen, dass es Carbage gesammelt (oder zumindest markiert, um Müll gesammelt werden), wenn die Methode zurückkehrt?

Static Repository

public static class AccountRepository 
{ 
    public static AccountModel GetAccountById(int accountId) 
    { 
     using (var context = new EntitiesContext()) 
     { 
      var account = context.Accounts.FirstOrDefault(a => a.Id == accountId); 
      if (account == null) 
      { 
       return null; 
      } 

      return new AccountModel 
      { 
       Id = account.Id, 
       Username = account.Username, 
       // etc... 
      }; 
     } 
    } 
} 

nicht-statische Repository

public class AccountRepository 
{ 
    public AccountModel GetAccountById(int accountId) 
    { 
     using (var context = new EntitiesContext()) 
     { 
      var account = context.Accounts.FirstOrDefault(a => a.Id == accountId); 
      if (account == null) 
      { 
       return null; 
      } 

      return new AccountModel 
      { 
       Id = account.Id, 
       Username = account.Username, 
       // etc... 
      }; 
     } 
    } 
} 
+0

Ich mag falsch sein, aber wie gilt dispose/garbage collection für statische Mitglieder? Sie werden nie entsorgt. – Veverke

+0

Statische Elemente werden auf einem Hochfrequenz-Heap gespeichert und dieser Heap wird niemals per GC angefahren. –

Antwort

3

Der einzige Unterschied zwischen dem Aufruf einer statischen Methode und einer Instanzmethode ist, dass statische Methoden einen weniger Parameter verwenden, : Die this Referenz, die an Instanzmethoden übergeben wird. Und da die DbContext in beiden Fällen in einer lokalen Variablen gespeichert ist, ist es kostenlos, wenn die Methode in beiden Fällen beendet wird. Kein Unterschied dort.

Das ist immer noch keine Entschuldigung für die Verwendung eines statischen Repository IMHO. Gutes vs. besseres Design kann subjektiv sein. Gut gegen schlechtes Design ist es nicht. SoC und SRP sind auch nicht.

Verwandte Themen