2015-06-26 3 views
1

я следующий сценарий, но с 4-мя способами и звонки вместо 2.рефакторинга несколько методов в один универсальный метод

RemoveNoLongerRequiredFromExceptions(newPeople, masterPeople); 
RemoveNoLongerRequiredFromMaster(newPeople, exceptionPeople); 

public void RemoveNoLongerRequiredFromMaster(List<NewPerson> newPeople, 
    List<MasterPerson> masterPeople) 
{ 
    var noLongerNewPeople = masterPeople.Where(a => !newPeople.Any(b => 
    a.PerId == b.PerId && a.AddressId == b.AddressId)); 

    foreach (var item in noLongerNewPeople) 
    {     
    _masterRepository.DeleteMasterPerson(item.MvpId); 
    }    
} 

public void RemoveNoLongerRequiredFromExceptions(List<NewPerson> newPeople, 
    List<ExceptionPerson> exceptionPeople) 
{ 
    var noLongerNewPeople = exceptionPeople.Where(a => !newPeople.Any(b => 
    a.PerId == b.PerId && a.AddressId == b.AddressId)); 

    foreach (var item in noLongerNewPeople) 
    { 
    _exceptionRepository.DeleteExceptionPerson(item.EvpId);     
    } 
} 

Единственное, что отличается о методах является второй входной параметр, однако каждый из них типы имеют требуемые свойства PerId & AddressId.

Кажется, что у daft есть 4 версии того, что по сути является одним и тем же методом, но с разными моделями/repos, когда я знаю, что все 4 имеют свойства и методы репо, которые мне нужно вызвать.

Я думаю, мне нужно реорганизовать это с помощью дженериков, но я даже не знаю с чего начать.

Используя простой пример, который я включил, как бы преобразовать 4 метода в один общий метод?

+0

Do У «MasterPerson» и «ExceptionPerson» есть общий базовый класс? – Lee

+0

Нет, они не имеют, у них обоих есть свои интерфейсы, но это было для DI – JsonStatham

+1

. Я сделал бы обычный класс 'Person' и использовал его для' MasterPerson' и 'ExceptionPerson' –

ответ

2

Я согласен с @ausin wernli:

public interface IPerson 
{ 
    int AddressId { get; } 
    int PerId { get; } 
    int UniqueEntityId { get; } 
} 

public MasterPerson : IPerson { 
    public int UniqueEntityId { get { return MvpId; } } 
} 
public ExceptionPerson : IPerson { 
    public int UniqueEntityId { get { return EvpId; } } 
} 

Однако тесная связь между IPerson детей и хранилищ не может быть то, что вы после этого, так что вы можете осуществить это в порядке:

public void RemoveNoLongerRequired<T>(List<NewPerson> newPeople, 
    List<T> masterPeople) where T : IPerson 
{ 
    var noLongerNewPeople = masterPeople.Where(a => !newPeople.Any(b => 
    a.PerId == b.PerId && a.AddressId == b.AddressId)); 

    foreach (var item in noLongerNewPeople) 
    { 
    if (typeof(T) == typeof(MasterPerson)) 
    { 
     _masterRepository.DeleteMasterPerson(item.UniqueEntityId); 
     continue; 
    } 
    if (typeof(T) == typeof(ExceptionPerson)) 
    { 
     _exceptionRepository.DeleteExceptionPerson(item.UniqueEntityId); 
     continue; 
    } 
    throw new NotImplementedException(); 
    } 
} 
+0

Я приветствую вас, сэр! –

+0

@ ondrej-svejdar Ошибка Невозможно преобразовать тип 'T' в 'PeopleMapping.Repository.Models.ExceptionPerson' – JsonStatham

+0

Не проблема, что каждая коллекция, пытающаяся использовать generics for, имеет свой собственный Id, evpId, mvpId, uvpId и emailId, как он может отбрасывать T каждому и каждому из них, когда у каждого из них есть другое имя идентификатора – JsonStatham

1

Вы можете сделать интерфейс IPerson и реализовать его как в MasterPerson, так и в ExceptionPerson. Определите метод, такой как DeletePerson(int id), и эта проблема становится тривиальной.

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