2016-09-27 3 views
0

Я использую Entity Framework и имею объекты PERSON, которые содержат несколько объектов EMAIL и PHONE. При обновлении человека у меня есть вспомогательный метод, который обновляет адреса и вспомогательный метод, который обновляет адреса электронной почты. Я не могу найти хороший способ устранить все дублирование кода между ними. Моя первая мысль заключалась в использовании дженериков, но я не могу придумать, как это сделать, когда я бы не закончил слишком сложный метод, который бы уменьшил читаемость больше, чем увеличил бы ремонтопригодность. Спасибо!Как слить эти два аналогичных метода

private void HandleEmailUpdate(PERSON personEntity, string emailType, string newValue) 
{ 
    var emailEntity = personEntity.EMAILs.FirstOrDefault(h => h.EMAIL_TYPE == emailType); 

    if (emailEntity == null) 
    { 
     if (string.IsNullOrEmpty(newValue)) 
      return; 

     var newEmail = new EMAIL 
     { 
      EMAIL_TYPE = emailType, 
      EMAIL_ADDR = newValue, 
      SSN = personEntity.SSN, 
      PID = personEntity.PID 
     }; 

     personEntity.EMAILs.Add(newEmail); 
     _context.Entry(newEmail).State = EntityState.Added; 
    } 
    else if (emailEntity.EMAIL_ADDR != newValue) 
    { 
     if (newValue == "") 
     { 
      _context.Entry(emailEntity).State = EntityState.Deleted; 
     } 
     else 
     { 
      _context.Entry(emailEntity).CurrentValues.SetValues(new {EMAIL_ADDR = newValue}); 
      _context.Entry(emailEntity).State = EntityState.Modified; 
     } 
    } 
} 

private void HandlePhoneUpdate(PERSON personEntity, string phoneType, string newValue) 
{ 
    var phoneEntity = personEntity.PHONEs.FirstOrDefault(h => h.PHONE_TYPE == phoneType); 

    if (phoneEntity == null) 
    { 
     if (string.IsNullOrEmpty(newValue)) 
      return; 

     var newPhone = new PHONE 
     { 
      PHONE_TYPE = phoneType, 
      PHONE1 = newValue, 
      SSN = personEntity.SSN, 
      PID = personEntity.PID 
     }; 

     personEntity.PHONEs.Add(newPhone); 
     _context.Entry(newPhone).State = EntityState.Added; 
    } 
    else if (phoneEntity.PHONE1 != newValue) 
    { 
     if (newValue == "") 
     { 
      _context.Entry(phoneEntity).State = EntityState.Deleted; 
     } 
     else 
     { 
      _context.Entry(phoneEntity).CurrentValues.SetValues(new {PHONE1 = newValue}); 
      _context.Entry(phoneEntity).State = EntityState.Modified; 
     } 
    } 
} 

Использование: (I цензурой из названия с 'XXX')

HandlePhoneUpdate(entity, "ALT", updatedPerson.PhoneAlt); 
HandlePhoneUpdate(entity, "CELL", updatedPerson.PhoneCellWork); 
HandlePhoneUpdate(entity, "SECOND_CELL", updatedPerson.PhoneCellPersonal); 
HandlePhoneUpdate(entity, "xxx", updatedPerson.Phonexxx); 
HandlePhoneUpdate(entity, "HOME", updatedPerson.PhoneHome); 
HandlePhoneUpdate(entity, "WORK", updatedPerson.PhoneWork); 

HandleEmailUpdate(entity, "ALT", updatedPerson.EmailAlt); 
HandleEmailUpdate(entity, "xxx", updatedPerson.Emailxxx); 
HandleEmailUpdate(entity, "HOME", updatedPerson.EmailPersonal); 
HandleEmailUpdate(entity, "xxx", updatedPerson.Emailxxx); 
HandleEmailUpdate(entity, "WORK", updatedPerson.EmailWork); 
+0

методы расширения будут удалены из параметров, таких как 'public void HandleSomething (этот человек PERSON, строка phoneType, строка newVal)' then call это как 'person.HandleSomething (" asd "," asdf "); 'и вы можете сделать это как' public void HandeSomething (этот PERSON, string Type, string newVal) {if (T is Phone) {...} else if (T is Email)} ' – Lucas

+0

Если классы EMAIL и PHONE не Не разделяйте базовый класс, тогда я не вижу, как вы можете объединить код и сохранить читаемость и техническую поддержку в одно и то же время без использования дженериков. – Ma3x

ответ

0

Если они следуют тем же правилам, имеет смысл объединить класс Phone и Email и создать Contact класс. Класс Contact будет иметь свойство Type (адрес электронной почты, телефон, ...), свойство Value и другие объекты, если необходимо. Таким образом, вы можете использовать один и тот же метод для обоих типов (электронная почта и телефон): HandleContactUpdate

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