本篇AutoMapper使用场景:
※ Decimal转换成String类型
※ 源数组转换成目标数组
※ 源中的集合(数组)属性转换成目标中的集合(数组)属性
※ 子类父类间的映射
Decimal转换成String类型
□ Domain model
public class Order
{
public decimal Amount { get; set; }
}
□ View model
public class OrderListViewModel
{
public string Amount { get; set; }
}
□ 通过实现ValueFormatter<>,可以实现类型的转换
public class MoneyFormatter : ValueFormatter<decimal>
{
protected override string FormatValueCore(decimal value)
{
return value.ToString("C");
}
}
□ 映射配置
AddFormatter<MoneyFormatter>();
Mapper.CreateMap<Order, OrderListViewModel>();
□ 使用
public ActionResult Index()
{
var order = new Order {Amount = 85M};
var orderListViewModel = Mapper.Map<Order, OrderListViewModel>(order);
return View(orderListViewModel);
}
□ 要点
属性类型的转换,我们可以自定义ValueFormatter<>。
源数组转换成目标数组
□ Domain model
public class Source
{
public int Value { get; set; }
}
□ View model
public class Dest
{
public int Value { get; set; }
}
□ 映射配置
Mapper.CreateMap<Source, Dest>();
□ 使用
public ActionResult ArraySample()
{
var sourceArray = new[]
{
new Source{Value = 1},
new Source{Value = 5},
new Source{Value = 10}
};
var destArray = Mapper.Map<Source[], Dest[]>(sourceArray);
return View(destArray.ToList());
}
□ 要点
创建映射是单个类之间的映射,但可以根据源集合获取到目标集合。
源中的集合(数组)属性转换成目标中的集合(数组)属性
□ Domain model
public class Order1
{
private IList<Order1Line> _lineItems = new List<Order1Line>();
public Order1Line[] LineItems
{
get { return _lineItems.ToArray(); }
}
public void AddLineItem(Order1Line orderLine)
{
_lineItems.Add(orderLine);
}
}
public class Order1Line
{
public int Quantity { get; set; }
}
□ View model
public class Order1Dto
{
public Order1LineDto[] LineItems { get; set; }
}
□ 映射配置
Mapper.CreateMap<Order1, Order1Dto>();
□ 使用
public ActionResult ArraySample1()
{
var order1 = new Order1();
order1.AddLineItem(new Order1Line(){Quantity =5});
order1.AddLineItem(new Order1Line(){Quantity = 15});
order1.AddLineItem(new Order1Line(){Quantity = 25});
var order1Dto = Mapper.Map<Order1, Order1Dto>(order1);
return View(order1Dto);
}
子类父类间的映射
//父类
public class Foo
{
public int Value { get; set; }
}
//子类
public class Bar : Foo
{
pubic int Value{get;set;}
}
public ActionResult JiCheng()
{
var source = new Bar() {Value = 5};
var dest = Mapper.Map<Bar, Foo>(source);
return View(dest);
}
□ 要点
继承关系类之间的映射不需要做映射配置