我正在尝试将我的ViewModel类映射到Web服务DTO对象。 ViewModels使用以下约定:
CustomerViewModel
OrderStatusViewModel
WCF类DTO具有以下约定:
Customer
OrderStatus
此外,如果WCF类DTO具有以下约定:
CustomerDTO
OrderStatusDTO
问题是我如何使用AutoMapper在ViewModel和WCF类之间进行映射?我想以某种方式映射,由于上面的配置,所有未来的ViewModel和WCF类都会自动映射。
答案 0 :(得分:3)
我在某个时候写过这篇文章。如果您愿意,请查看:http://www.weirdlover.com/2010/07/01/the-big-boy-mvc-series-part-22-whoop/
添加对自动提取
的引用创建基础 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类。指定您要将ViewModel映射到的哪个DTO:
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();
}
如果您想获得幻想,可以创建另一个ViewModel基础calss,允许您传入自己的 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"
};
}
}
答案 1 :(得分:0)
你可以看一下:mvmmapper.codeplex.com 我为Visual Studio编写了一个工具,为您生成映射。
阅读示例以了解该工具的功能,然后决定编写自己的工具或使用现有工具......
编辑:有look at this code它来自MVMMapper并正在生成。它可能会给你一个想法。