2012-06-27 4 views
1

Если у меня есть две модели, которые сильно отличаются друг от друга, то это означает, что целью является использование каркаса отображения, например Auto Mapper или Value Injecter?Использование каркаса отображения с совершенно разными доменами и моделями просмотра?

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

Я предполагаю, что я в основном пытаюсь понять:

1) Есть ли какие-либо преимущества для использования рамок отображения помимо экономии коды я получить от его отображения по-конвенция?

2) Разве еще проще настроить сопоставление для вышеуказанного сценария в структуре сопоставления и сопоставления вручную в этом случае? (Это не похоже, как он.)

+0

AutoMapper предназначен, чтобы избавиться от кода, который вы бы уже писать, применяя конвенции. Если нет схемы картографии, в чем смысл? Более того - насколько далеко эти модели? –

+0

просто сделайте это вручную – Omu

ответ

1

1) Есть ли какая-либо польза от использования структуры отображения кроме экономии кода, я получаю от его сопоставления по соглашению?

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

2) Разве еще проще настроить сопоставление для вышеуказанного сценария в структуре сопоставления и сопоставления вручную в этом случае? (. Это не похоже, как это)

Я думаю, что это примерно то же самое:

Mapper.CreateMap<EntityModel, ViewModel() 
    .ForMember(d => d.Prop1, o => o.MapFrom(s => s.Property1)) 
    .ForMember(d => d.Prop2, o => o.MapFrom(s => s.Property2)) 
    .ForMember(d => d.Prop3, o => o.MapFrom(s => s.Property3)) 
     ... 
    .ForMember(d => d.PropN, o => o.MapFrom(s => s.PropertyN)) 
; 

С помощью этого отображения, весь код DTO будет выглядеть следующим образом:

var model = Mapper.Map<ViewModel>(entityInstance); 

. ..versus ... Если вы DIT вручную, это выглядит примерно так же мне:

var model = new ViewModel 
{ 
    Prop1 = entityInstance.Property1, 
    Prop2 = entityInstance.Property2, 
    Prop3 = entityInstance.Property3, 
     ... 
    PropN = entityInstance.PropertyN, 
}; 

Другая интересная вещь о AutoMapper над Valuei njecter заключается в том, что вам нужно всего лишь определить 1 сопоставление, которое затем будет работать для отображения как отдельных экземпляров, так и коллекций.

var models = Mapper.Map<ViewModel[]>(entityInstances); 

... против

var models = entityInstances.Select(new ViewModel 
{ 
    Prop1 = entityInstance.Property1, 
    Prop2 = entityInstance.Property2, 
    Prop3 = entityInstance.Property3, 
     ... 
    PropN = entityInstance.PropertyN, 
}); 
+0

Будет легче определить ручное сопоставление в неявных или явных операторах (преобразование), не будет? – k0stya

+0

@ k0stya, извините, я не следую. – danludwig

0

Например, у меня есть две модели, которые структурно идентичны, но каждое имя свойства отличается,

Это вы, что проектируют модели просмотра => у вас есть полный контроль над ними (вопреки вашим моделям домена, которые могут быть, например, созданы автоматически из базы данных или что-то разработчиком) => вы можете назвать их свойства соответственно :-)

+0

Я согласен, но иногда с устаревшим кодом (модели домена) вы хотите воспользоваться возможностью немного почистить вещи.Или, не могли бы вы по-прежнему сделать ваши новые модели совместимыми с плохо разработанными моделями доменов в интересах упрощения сопоставления? –

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