2015-04-22 2 views
5

Недавно у меня возникла дискуссия с коллегой по вопросу о том, должен ли быть репозиторий в веб-приложении (в данном случае, слоем поверх Entity Framework) как статическом или нестационарном.Репозиторий как статический или нестатический класс?

В этом вопросе меня не интересует, является ли одна или другая реализация лучшей (ООП), потому что это сделает ответы субъективными.

Что меня интересует: Является ли создание экземпляра Entity Framework DbContext иным способом в CLR, когда вы сравниваете статическую с нестатическим классом? Меня особенно интересуют многопоточные проблемы и использование памяти, потому что этот код работает в веб-приложении MVC.

Edit: Просто для уточнения: Я не заинтересован в утилизации или сборке мусора класса хранилища, только то, что происходит с локальной переменной context. Правильно ли сказать, что собранный мусор (или, по крайней мере, отмечен как сборщик мусора), когда метод возвращается?

Статическое хранилище

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... 
      }; 
     } 
    } 
} 

нестатические хранилище

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

Возможно, я ошибаюсь, но как применяется утилизация/сборка мусора для статических элементов? Они никогда не располагаются/не отрываются. – Veverke

+0

Статические элементы хранятся на высокочастотной куче, и эта куча никогда не приближается к GC. –

ответ

3

Единственное различие между вызовом статического метода и метода экземпляра является то, что статические методы используют один меньше параметра : ссылка this, которая передается методам экземпляра. И так как DbContext хранится в локальной переменной в обоих случаях, он может быть собран в мусор, когда метод заканчивается в любом случае. Никакой разницы нет.

Это все еще не может служить оправданием для использования статического хранилища IMHO. Хороший и лучший дизайн может быть субъективным. Хорошего против плохого дизайна нет. SoC и SRP тоже.

Смежные вопросы