Репозиторий как статический или нестатический класс?

недавно у меня было обсуждение с коллегой о том, должен ли репозиторий в веб-приложении (в данном случае слой поверх 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...
            };
        }
    }
}

1 ответов


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

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