2014-10-22 5 views
0

Я пытаюсь использовать automapper для преобразования данных Контракты на объекты клиента и наоборот. Чтобы уменьшить строки кода и упростить его, я хочу динамически создавать сопоставление. Допустим, я звоню в 5 разных сервисов, и каждая служба будет возвращать тот же объект, что и Employee, но данные будут разными (если мне нужна информация о сотрудниках от Microsoft, я позвоню в службу поддержки Microsoft или, если я хочу, чтобы данные о сотрудниках IBM я буду называть службой IBM, на).Общее сопоставление в Automapper

Мой объект что-то вроде ниже ..

Использование Automapper я могу написать что-то ниже ..

Mapper.CreateMap<Service1. PersonDetails, PersonDetails >(); 
    Mapper.CreateMap<Service1.Employee, Employee>() 
     .ForMember(DEST=>DEST. PersonDetails,M=>M.MapFrom(Q=>Q. PersonDetails)); 
    Mapper.CreateMap<Service2. PersonDetails, PersonDetails >(); 
    Mapper.CreateMap<Service2.Employee, Employee>() 
     .ForMember(DEST=>DEST.PersonDetails,M=>M.MapFrom(Q=>Q. PersonDetails)); 

Бути должен написать же самую Сходная логика 5 раз, так как я звоню 5 различные услуги.

Есть ли способ, что я могу сделать это динамически означает, что я хочу сказать Automapper об источнике во время выполнения ..

Пожалуйста посоветуйте !!!

+1

Являются ли сервисы одинаковыми (а не просто похожими)? Если это так, вы должны иметь возможность использовать одни и те же классы DataContract для всех из них. С другой стороны, если они только похожи друг на друга, я не вижу, как Automapper поможет вам автоматически разрешить различия. –

+0

@ Услуги JeroenMostert разные, поэтому каждый datacontract будет поступать из разных пространств имен. Я думаю, что динамический automapper может решить проблему, но не уверен, насколько это точно. – Vicky

+0

Что я имею в виду - это услуги * структурно * разные (что есть, являются ли их запросы совершенно разными) или они одинаковы, за исключением адресов их конечных точек и автогенерированных пространств имен? Потому что в вашем примере выше нет явных различий. –

ответ

0

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

public interface IEmployeeServiceResponce 
{ 
    Employee {get;} 
    PersonDetails{get;} 
} 

затем каждая служба реализует этот интерфейс.

Это articular может сформулировать мое предложение чуть более

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

+0

: Спасибо за ответ. Что означает «означает, что« каждый сервис реализует этот интерфейс ». как мы можем сделать реализацию службы изменений в случае, если сервис является внешним. Не могли бы вы немного рассказать об шаблоне адаптера, который будет говорить. – Vicky

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