本篇AutoMapper使用场景:

※ 源字典集合转换成目标字典集合

※ 枚举映射

※ 自定义解析器

※ 源中的复杂属性和Get...方法转换成目标属性

源字典集合转换成目标字典集合

□ Domain model

public class SourceValue

{

public int Value { get; set; }

}

□ View model

public class DestValue

{

public int Value { get; set; }

}

□ 映射配置

Mapper.CreateMap<SourceValue, DestValue>();

□ 使用

public ActionResult Dic()

{

var sourceDict = new Dictionary<string, SourceValue>

{

{"First", new SourceValue(){Value = 5}},

{"Second",new SourceValue(){Value = 10}}

};

var destDict = Mapper.Map<Dictionary<string, SourceValue>, IDictionary<String, DestValue>>(sourceDict);

return View((destDict));

}

枚举映射

public enum OrderStatus : short

{

InProgress = 0,

Complete = 1

}

public enum OrderStatusDto

{

InProgress = 0,

Complete = 1

}

□ 使用

//例子1

public ActionResult Meiju()

{

var dest = Mapper.Map<OrderStatus, OrderStatusDto>(OrderStatus.InProgress);

return View(dest);

}

//例子2

public ActionResult Meiju1()

{

var dest =

Mapper.Map<AttributeTargets, AttributeTargets>(AttributeTargets.Class | AttributeTargets.Interface);

return View(dest);

}

□ 要点

枚举映射不需要做映射配置。

自定义解析器

□ Domain model

public class Source1

{

public int Value { get; set; }

public int Value2 { get; set; }

}

□ View model

public class Destination1

{

public int Total { get; set; }

}

□ 自定义解析器,继承于ValueResolver<,>

public class CustomResolver : ValueResolver<Source1,int>

{

protected override int ResolveCore(Source1 source)

{

return source.Value + source.Value2;

}

}

□ 映射配置

Mapper.CreateMap<Source1, Destination1>()

.ForMember("Total", opt => opt.ResolveUsing<CustomResolver>());

□ 使用

public ActionResult Jiexi()

{

var source = new Source1()

{

Value = 5,

Value2 =  7

};

var dest = Mapper.Map<Source1, Destination1>(source);

return View(dest);

}

□ 要点

派生ValueResolver<,>实现自定义解析器,实现对源属性的"计算" 转换成目标属性。

源中的复杂属性和Get...方法转换成目标属性

□ Domain model

public class Order2

{

private readonly IList<OrderLineItem2> _orderLineItems = new List<OrderLineItem2>();

public Customer2 Customer { get; set; }

public OrderLineItem2[] GetOrderlineItems()

{

return _orderLineItems.ToArray();

}

public void AddOrderLineItem(Product2 product, int quantity)

{

_orderLineItems.Add(new OrderLineItem2(product, quantity));

}

public decimal GetTotal()

{

return _orderLineItems.Sum(li => li.GetTotal());

}

}

public class OrderLineItem2

{

public OrderLineItem2(Product2 product, int quantity)

{

Product = product;

Quantity = quantity;

}

public Product2 Product { get; set; }

public int Quantity { get; set; }

public decimal GetTotal()

{

return Quantity*Product.Price;

}

}

public class Customer2

{

public string Name { get; set; }

}

public class Product2

{

public string Name { get; set; }

public decimal Price { get; set; }

}

□ View model

public class Order2Dto

{

public string CustomerName { get; set; }

public decimal Total { get; set; }

}

□ 映射配置

Mapper.CreateMap<Order2, Order2Dto>();

□ 使用

public ActionResult Complex()

{

var customer = new Customer2()

{

Name = "Darren"

};

var order = new Order2()

{

Customer = customer

};

var product = new Product2()

{

Name = "bosco",

Price = 5.00m

};

order.AddOrderLineItem(product, 10);

Order2Dto dto = Mapper.Map<Order2, Order2Dto>(order);

return View(dto);

}

□ 要点

目标中的属性遵循惯例:

○ 源中复杂属性名+复杂属性对应类的属性,构成了目标属性

○ 源中Get...()方法转换成目标中的...属性

AutoMapper在MVC中的运用03-字典集合、枚举映射,自定义解析器的更多相关文章

  1. AutoMapper在MVC中的运用06-一次性定义映射、复杂类型属性映射

    本篇AutoMapper使用场景: ※ 当源和目标具有同名的复杂类型属性.集合类型属性,这2种属性对应的类间也需建立映射 ※ 一次性定义好源和目标的所有映射 ※ 一次性定义好源和目标的所有映射,目标中 ...

  2. AutoMapper在MVC中的运用小结

    配置.单元测试.AOP注入 Decimal转换成String类型 源数组转换成目标数组 源中的集合(数组)属性转换成目标中的集合(数组)属性 子类父类间的映射 源字典集合转换成目标字典集合 枚举映射 ...

  3. AutoMapper在MVC中的运用01-配置、使用、单元测试、举例

    MVC中,如果想在Domain Model和View Model之间建立映射,用AutoMapper是一个不错的选择.不仅如此,AutoMapper能在不同对象之间建立映射,比如string与int类 ...

  4. AutoMapper在MVC中的运用07-映射在订单场景的例子

    本文参考了Taswar Bhatti的博客,他写了<Instant AutoMapper>这本书.遗憾的是,这本电子版书在国内还买不到,也下载不到.也只能从他的有限几篇博文中来窥探一二了. ...

  5. AutoMapper在MVC中的运用04-string映射各种类型、一个属性映射多个属性等

    本篇AutoMapper使用场景: ※ 类型转换,源string类型分别转换成int, DateTime,Type ※ 源和目标都包含复杂类型属性 ※ 把源中的一个属性映射到目标中的多个属性 类型转换 ...

  6. AutoMapper在MVC中的运用05-映射中的忽略、处理null、多种映射转换

    本篇AutoMapper使用场景: ※ 动态实现接口方法或属性 ※ 目标中的属性如果比源多,可以忽略多出的属性 ※ 目标有virtual属性,可忽略 ※ 目标属性值为null的解决办法 ※ int转s ...

  7. AutoMapper在MVC中的运用02-Decimal转String、集合、子父类映射

    本篇AutoMapper使用场景: ※ Decimal转换成String类型 ※ 源数组转换成目标数组 ※ 源中的集合(数组)属性转换成目标中的集合(数组)属性 ※ 子类父类间的映射 Decimal转 ...

  8. MVC中System.InvalidOperationException: 传入字典的模型项的类型为“XXX”,但此字典需要类型“XXA”的模型项

    出现此类错误的一个原因是Controller传过去的Model和View中的Model不是同一个Model

  9. mvc 中合并两个list集合

    有时候,在进行查询操作的时候需要将从数据库中查询的两张表进行合并,成为一张表然后返回给前端.或者在原有的一张表基础上面加几个新的字段. 这个时候可以新建一个.class[model类],在这个新建的m ...

随机推荐

  1. 数组slice方法

    slice slice(start,end):方法可从已有数组中返回选定的元素,返回一个新数组,包含从start到end(不包含该元素)的数组元素.(不会改变原数组) start参数:必须,规定从何处 ...

  2. Entity Framework 6.1.0 Tools for Visual Studio 2012 & 2013

    http://www.microsoft.com/en-us/download/confirmation.aspx?id=40762

  3. 绘图: matplotlib核心剖析

    参考:http://www.cnblogs.com/vamei/archive/2013/01/30/2879700.html http://blog.csdn.net/ywjun0919/artic ...

  4. socket编程之select相关

    FD_ZERO,FD_ISSET这些都是套节字结合操作宏 看看MSDN上的select函数, 这是在select   io   模型中的核心,用来管理套节字IO的,避免出现无辜锁定. int   se ...

  5. nodejs乱码处理

    1.处理回显乱码 res.write("<head><meta charset='utf-8'></head>"); 2.处理传参乱码 quer ...

  6. plaidctf-2016 Pwn试题小结

    回顾了一下今年plaidctf Pwn部分的题目,感觉还是蛮有意思的,值得研究一下. 1.unix_time_formatter-76 最简单的一道题,考点是UAF.说是UAF但是其实根本就不算是真正 ...

  7. SVN服务器搭建和使用-转载

    SVN服务器搭建和使用(一)-转载 原文地址:http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407610.html Subversion ...

  8. WebSocket原理说明

    WebSocket原理说明 众所周知,Web应用的通信过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给客户端,客户端浏览器将信息呈现.这种机制对于信息变化不是特别频繁的应 ...

  9. P1616 疯狂的采药 洛谷

    题目描述 LiYuxiang是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说 ...

  10. oj提交时常见错误归纳

    Presentation Error: 常见的PE错误应该有以下的几种情况: 每行输出之后有空行 每两行输出之间有空行 一行中,每个输出数字(或字符串,等)之间有空格 一行中,每个输出数字(或字符串, ...