AutoMapper在MVC中的运用03-字典集合、枚举映射,自定义解析器
本篇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-字典集合、枚举映射,自定义解析器的更多相关文章
- AutoMapper在MVC中的运用06-一次性定义映射、复杂类型属性映射
本篇AutoMapper使用场景: ※ 当源和目标具有同名的复杂类型属性.集合类型属性,这2种属性对应的类间也需建立映射 ※ 一次性定义好源和目标的所有映射 ※ 一次性定义好源和目标的所有映射,目标中 ...
- AutoMapper在MVC中的运用小结
配置.单元测试.AOP注入 Decimal转换成String类型 源数组转换成目标数组 源中的集合(数组)属性转换成目标中的集合(数组)属性 子类父类间的映射 源字典集合转换成目标字典集合 枚举映射 ...
- AutoMapper在MVC中的运用01-配置、使用、单元测试、举例
MVC中,如果想在Domain Model和View Model之间建立映射,用AutoMapper是一个不错的选择.不仅如此,AutoMapper能在不同对象之间建立映射,比如string与int类 ...
- AutoMapper在MVC中的运用07-映射在订单场景的例子
本文参考了Taswar Bhatti的博客,他写了<Instant AutoMapper>这本书.遗憾的是,这本电子版书在国内还买不到,也下载不到.也只能从他的有限几篇博文中来窥探一二了. ...
- AutoMapper在MVC中的运用04-string映射各种类型、一个属性映射多个属性等
本篇AutoMapper使用场景: ※ 类型转换,源string类型分别转换成int, DateTime,Type ※ 源和目标都包含复杂类型属性 ※ 把源中的一个属性映射到目标中的多个属性 类型转换 ...
- AutoMapper在MVC中的运用05-映射中的忽略、处理null、多种映射转换
本篇AutoMapper使用场景: ※ 动态实现接口方法或属性 ※ 目标中的属性如果比源多,可以忽略多出的属性 ※ 目标有virtual属性,可忽略 ※ 目标属性值为null的解决办法 ※ int转s ...
- AutoMapper在MVC中的运用02-Decimal转String、集合、子父类映射
本篇AutoMapper使用场景: ※ Decimal转换成String类型 ※ 源数组转换成目标数组 ※ 源中的集合(数组)属性转换成目标中的集合(数组)属性 ※ 子类父类间的映射 Decimal转 ...
- MVC中System.InvalidOperationException: 传入字典的模型项的类型为“XXX”,但此字典需要类型“XXA”的模型项
出现此类错误的一个原因是Controller传过去的Model和View中的Model不是同一个Model
- mvc 中合并两个list集合
有时候,在进行查询操作的时候需要将从数据库中查询的两张表进行合并,成为一张表然后返回给前端.或者在原有的一张表基础上面加几个新的字段. 这个时候可以新建一个.class[model类],在这个新建的m ...
随机推荐
- retrying模块的学习
retrying模块的学习 我们在写爬虫的过程中,经常遇到爬取失败的情况,这个时候我们一般会通过try块去进行重试,但是每次都写那么一堆try块,真的是太麻烦,所以今天就来说一个比较pythonic的 ...
- MXNet深度学习库简介
MXNet深度学习库简介 摘要: MXNet是一个深度学习库, 支持C++, Python, R, Scala, Julia, Matlab以及JavaScript等语言; 支持命令和符号编程; 可以 ...
- [原创]Sql2008 使用TVP批量插入数据
TVP(全称 :Table-Valued Parameter) 叫做表值参数(Table-Valued Parameter)是SQL2008的一个新特性.顾名思义,表值参数表示你可以把一个表类型作为参 ...
- Nginx安装及常用命令
一.选定源码目录 cd /usr/local/src 可以是任何目录,本文选定的是/usr/local/src 二.安装依赖库 yum install gcc yum install pcre-dev ...
- 008 使用POJO对象绑定请求参数
1.介绍 2.Person.java package com.spring.bean; public class Person { private String username; private S ...
- MySQL 中国省市区SQL表数据
MySQL 中国省市区SQL表数据 1.查省SELECT * FROM china WHERE china.Pid=02.查市SELECT * FROM chinaWHERE china.Pid= ...
- 戏说 Spring MVC 框架
Spring MVC 是 Spring 框架的一部分,和 Struts 一样都是属于 web 层框架,根据项目分层的思想,一个项目基本可以分为持久层,业务层和 web 层.而 Spring MVC 主 ...
- 前端代码控制gif图暂停与播放的坑
废话不说,先看效果..... 方案一.方案二效果: 方案三效果: <!DOCTYPE html> <html> <head> <meta charse ...
- python中的*和**参数传递机制
python的参数传递机制具有值传递(int.float等值数据类型)和引用传递(以字典.列表等非值对象数据类型为代表)两种基本机制以及方便的关键字传递特性(直接使用函数的形参名指定实参的传递目标,如 ...
- Web大前端面试题-Day3
1. javascript的typeof返回哪些数据类型? 答案: undefined string boolean number symbol(ES6) Object Function 2. 列举3 ...