Я писал об этом когда-то назад. Проверьте «эр, если вы хотите: 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"
};
}
}
Возможно, это только я, но я действительно не вижу здесь вопроса. Я вижу, что вы делаете некоторые заявления о своем соглашении об именах, но в чем вопрос? – spinon
см. Обновленный вопрос! – johndoe