2011-01-05 2 views
1

Я пытаюсь сопоставить классы ViewModel с объектами DTO веб-службы. В ViewModels используется следующее соглашение:Система на основе системы AutoMapper

CustomerViewModel 
OrderStatusViewModel 

Классы WCF DTO имеет следующее соглашение:

Customer 
OrderStatus 

Кроме того, что если классы WCF DTO имеет следующее соглашение:

CustomerDTO 
OrderStatusDTO 

Вопрос в том, как я могу сопоставить между классами ViewModel и WCF с помощью AutoMapper? Я хочу точно определить, что все будущие классы ViewModels и WCF отображаются автоматически из-за вышеуказанной конфигурации.

+0

Возможно, это только я, но я действительно не вижу здесь вопроса. Я вижу, что вы делаете некоторые заявления о своем соглашении об именах, но в чем вопрос? – spinon

+0

см. Обновленный вопрос! – johndoe

ответ

3

Я писал об этом когда-то назад. Проверьте «эр, если вы хотите: http://www.weirdlover.com/2010/07/01/the-big-boy-mvc-series-part-22-whoop/

Добавить ссылку на Automapper

Создать базу ViewModel класс:

public abstract class MappedTo<T> 
{ 
    public MappedTo() 
    { 
     Mapper.CreateMap(GetType(), typeof(T)); 
    } 

    public T Convert() 
    { 
     return (T)Mapper.Map(this, this.GetType(), typeof(T)); 
    } 
} 

Создать ViewModel класс, который унаследован от вышеупомянутое основание. Укажите, какие DTO вы хотите сопоставить ViewModel к:

class AddressViewModel : MappedTo<Address> 
{ 
    public string Line1 { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
} 

AutoMapper должен справиться с остальными:

static void Main(string[] args) 
{ 
    AddressViewModel addressVm = new AddressViewModel 
    { 
     Line1 = "555 Honolulu Street", 
     City = "Honolulu", 
     State = "HI" 
    }; 

    Address address = addressVm.Convert(); 

    Console.WriteLine(address.Line1); 
    Console.WriteLine(address.City); 
    Console.WriteLine(address.State); 
    Console.ReadLine(); 
} 

Если вы хотите получить фантазии, вы можете создать еще одну базу Calss ViewModel, который позволяет пройти в собственном TypeConverter:

public abstract class MappedTo<T, TConverter> 
{ 
    public MappedTo() 
    { 
     Mapper.CreateMap(GetType(), typeof(T)).ConvertUsing(typeof(TConverter)); 
    } 

    public T Convert() 
    { 
     return (T)Mapper.Map(this, this.GetType(), typeof(T)); 
    } 
} 

Затем, вы можете преобразовать ваш ViewModel к вашим DTO как вы считаете нужным:

public class AddressConverter : TypeConverter<AddressViewModel, Address> 
{ 
    protected override Address ConvertCore(AddressViewModel source) 
    { 
     return new Address 
     { 
      Line1 = source.Line1 + " foo", 
      City = source.City + " foo", 
      State = source.State + " foo" 
     }; 
    } 
} 
+0

Это потрясающе! Но могу ли я как-то сказать AutoMapper, что моя конвенция такова, что viewmodel будет иметь то же точное имя, но слово «ViewModel» в конце. например CustomerViewModel (viewmodel) и Customer (класс). Таким образом, Automapper может автоматически разрешать все сопоставления. – azamsharp

+0

@azamsharp - Я так не думаю.Возможно, я ошибаюсь, но вы должны сказать AutoMapper, какие два класса вы хотите отобразить. Вы можете использовать шаблон T4 для автогенерации этих сопоставлений, основанных на соглашении, но это кажется ненужным. Почему бы не сделать «CustomerViewModel: MappedTo « как я сделал выше? Это слишком большая боль? Cheers, E –

+0

Спасибо, ewwwyn! Я буду использовать ваш подход! – azamsharp

0

Вы можете взглянуть на это: mvmmapper.codeplex.com Я написал инструмент для Visual Studio, который создает для вас сопоставление.

Прочитайте примеры, чтобы получить представление о том, что инструмент делает и затем решить, чтобы написать свой собственный инструмент или использовать существующий один ...

Edit: Есть look at this code это от MVMMapper и который генерируется. Это может дать вам идею.

+0

Вопрос изложен выше! Как мне отображать между классами ViewModel и WCF? – johndoe

+0

Спасибо, но я должен использовать AutoMapper! – johndoe

+0

Ах, да, я заметил, что после того, как вы добавили свой вопрос. –

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