2013-07-02 4 views
4

У меня есть класс с некоторыми статическими списками. Для демонстрационных целей я покажу только два:Передача контекста базы данных статическим методам

public class Foo 
{ 
    public static readonly List<long> FirstList(EfEntities dbContext) 
    { 
     return dbContext.SomeTable.Where(x => x == 1).ToList(); 
    } 

    public static readonly List<long> SecondList(EfEntities dbContext) 
    { 
     return dbContext.SomeTable.Where(x => x == 2).ToList(); 
    } 
} 

Я не большой поклонник прохождения моего контекста базы данных к каждому статическому методу. Есть ли у вас какие-либо предложения по различным подходам?

+1

Это поможет, если вы объясните, что вам не нравится в первую очередь, и контекст, в котором вы его используете. Например, почему бы не обернуть контекст в другом классе, который имеет эти методы экземпляра? –

+0

@JonSkeet В моих первых тестах у меня были статические жестко закодированные списки. Но я хотел бы, чтобы код был больше управляемым данными, поэтому я хотел бы изменить его на фактические ключи таблицы, которые я жестко кодировал в первую очередь. Полагаю, ваш предложенный подход - это путь. – Johan

ответ

1

Не делайте его статическим. Для этих списков требуется контекст. Статические элементы меньше ориентированы на контекст. Таким образом, в основном вы хотите переместить эти методы в экземпляр класса и предоставить контекст при построении посредством инъекции зависимостей или какой-либо другой фабрики.

Каково конструктивное решение придерживаться статики? Ужасное обходное решение будет передавать контекст один раз в статическое поле, а затем использовать его, но это в основном то, что вы должны делать с экземпляром класса.

+0

Спасибо за подсказку. Я сделал их статичными, когда у меня были жестко закодированные списки. Я полагаю, это подходящее время для изменения типа – Johan

4

Хорошая идея в этом случае (конечно, если использование статических методов оправдано архитектуры, но это, кажется, выходит за рамки данного вопроса) может быть создавать свои статические методы, как extension methods:

public static class EfEntitiesExtensions 
{ 
    public static readonly List<long> FirstList(this EfEntities dbContext) 
    { 
     return dbContext.SomeTable.Where(x => x == 1).ToList(); 
    } 

    public static readonly List<long> SecondList(this EfEntities dbContext) 
    { 
     return dbContext.SomeTable.Where(x => x == 2).ToList(); 
    } 
} 

После этого вы можете называть их так:

... 
EfEntities dbContext = new EfEntities(); 
List<long> firstList = dbContext.FirstList(); 
2

Мне лично не нравится идея передать объект dbContext в качестве параметра. Вы можете полностью отделить слой данных и сохранить его в другом классе.

public class DataAccess { 
    private EFEntities _dbContext { get; set; } 

    public EfEntities GetDbContext() { 
     if (_dbContext != null) { 
      return _dbContext; 
     } else { 
      _dbContext = new EFEntities(.....); 
      return _dbContext; 
     } 
    } 
} 

Затем вы можете ссылаться на DataAccess класс, который содержит контекст, что нужно, а не передать его в качестве параметра каждый раз.

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