2016-09-01 2 views
0

Пожалуйста, смотрите этот кодцентрализовать данные в Service Layer

public class MedierService : Singleton<MedierService> 
{ 
    PresseEntities _db = new PresseEntities(); 
    IQueryable<Medier> _mediers; 

    public MedierService() 
    { 
     _mediers = _db.Mediers.Select(s => s); 
    } 

    public List<Medier> GetAll(MedierStatus m) 
    { 
     var retVal = Enumerable.Empty<Medier>(); 
     switch (m) 
     { 
      case MedierStatus.New: 
       retVal = _mediers.Where(w => w.vis == 1 && w.dato_slettet == new DateTime(1900, 01, 01)); 
       break; 
      case MedierStatus.Deleted: 
       retVal = _mediers.Where(w => w.vis == 1 && w.dato_slettet != new DateTime(1900, 01, 01)); 
       break; 
     } 
     return retVal.ToList(); 
    } 
} 

против

public class MedierService : Singleton<MedierService> 
{ 
    PresseEntities _db = new PresseEntities(); 

    IQueryable<Medier> _GetAll() 
    { 
     return _db.Mediers.Select(s => s); 
    } 

    public List<Medier> GetAll(MedierStatus m) 
    { 
     var retVal = Enumerable.Empty<Medier>(); 
     switch (m) 
     { 
      case MedierStatus.New: 
       retVal = _GetAll().Where(w => w.vis == 1 && w.dato_slettet == new DateTime(1900, 01, 01)); 
       break; 
      case MedierStatus.Deleted: 
       retVal = _GetAll().Where(w => w.vis == 1 && w.dato_slettet != new DateTime(1900, 01, 01)); 
       break; 
     } 
     return retVal.ToList(); 
    } 
} 

Alright, поэтому выше коды будут оба возвращают меня точно такой же результат после вызова MedierService.Instance.GetAll(MedierStatus.New).

Я совершенно не знаком с C#, и я надеюсь, что мой код имеет смысл.

То, что я пытаюсь сделать здесь, состоит в том, чтобы сделать централизацию _mediers и _GetAll, поэтому я могу легко фильтровать результаты, если фильтр является глобальным, поэтому мне не нужно идти прямиком и помещать фильтр.

Теперь моя проблема

Я не знаю, если я делаю это правильно, в моем первом примере, я сделал это с помощью конструктора и создал переменную _mediers, а на втором я просто создал частный метод с именем _GetAll().

Итак, вот мои вопросы: 1.) Каков правильный способ? Первый или следующий?

2.) Можно ли сделать _mediers и _GetAll() IQueryable, чтобы он не загружал все данные из моей базы данных и не позволял моим методам его фильтровать?

3.) Можно ли префикс подчеркивать мой метод _GetAll(), потому что это частный метод?

4.) Есть ли способ улучшить мой код?

Все ваши ответы очень помогут мне и улучшат мои навыки кодирования. Спасибо так много

+1

Ваш метод GetAll() может просто сказать 'return _db.Mediers' - выбор не требуется. Кроме того, соглашение об именовании подчеркивания должно использоваться для частных полей, но не для методов. Частные методы должны быть объявлены 'private' и начинаться с строчной буквы. –

+0

Пожалуйста, ограничитесь одним вопросом на вопрос. Кроме того, в настоящее время ваш вопрос почти полностью основан на мнениях. Если у вас есть рабочий код, это ваш собственный код, и вы хотите знать, что вы можете сделать для его улучшения, [codereview.se] может быть лучшим сайтом. Пожалуйста, прочитайте их справочный центр, чтобы убедиться, что ваш вопрос по теме. –

ответ

1

Просто один метод GETALL (т.е. удалить метод _GetAll и не конструктор требуется)

public List<Medier> GetAll(MedierStatus m) 
{ 
    var date = new DateTime(1900, 01, 01); 
    var retVal = _db.Mediers 
     .Where(w => w.vis == 1 && 
       ((w.dato_slettet == date && m == MedierStatus.New) 
      || (w.dato_slettet != date && m == MedierStatus.Deleted))); 


    return retVal.ToList(); 
} 

Что касается префикса указывать частный метод, а в явной форме использовать частный модификатор доступа.

private IQueryable<Medier> GetAll() {...} 
Смежные вопросы