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...
};
}
}
}
Ich mag falsch sein, aber wie gilt dispose/garbage collection für statische Mitglieder? Sie werden nie entsorgt. – Veverke
Statische Elemente werden auf einem Hochfrequenz-Heap gespeichert und dieser Heap wird niemals per GC angefahren. –