本篇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. MVC js动态生成from提交数据然后生成文件下载

    前台: 点击触发下面事件 var turnForm = document.createElement("form"); //一定要加入到body中!! document.body. ...

  2. MVC5使用EF6 Code First--创建EF数据模型(一)

    此Web应用程序演示如何使用Entity Framework 6和Visual Studio 2015创建ASP.NET MVC 5应用程序.本教程使用“Code First ”即代码先行.有关如何在 ...

  3. CVE-2010-0249 IE8 UAF漏洞分析

    CVE-2010-0249 [CNNVD]Microsoft Internet Explorer非法事件操作内存破坏漏洞(CNNVD-201001-153) Microsoft Internet Ex ...

  4. ***Bootstrap FileInput插件的使用经验汇总

    插件下载地址: https://github.com/kartik-v/bootstrap-fileinput/ 官方DEMO查看: http://plugins.krajee.com/file-ba ...

  5. ADO.Net练习1

    一. 1.Car表数据查出显示2.请输入要查的汽车名称:     请输入要查的汽车油耗:     请输入要查的汽车马力: static void Main(string[] args) { SqlCo ...

  6. linux {..}用法

    一.2018-{01..07}* 这个意思是 2018-01*   到2018-07*全部输出出来. 二.echo {a..c} a b c

  7. 013.Zabbix的Items(监控项)

    一 Items简介 Items是从主机里面获取的所有数据,可以配置获取监控数据的方式.取值的数据类型.获取数值的间隔.历史数据保存时间.趋势数据保存时间.监控key的分组等. 通常情况下item由ke ...

  8. 使用Synchronized关键字同步类方法

    要想解决“脏数据”的问题,最简单的方法就是使用synchronized关键字来使run方法同步,代码如下: public synchronized void run() { } 从上面的代码可以看出, ...

  9. Web Service(二):cxf 实现

    1. cxf简介 Web Services 的一种实现方式. Apache CXF = Celtix + XFire,后更名为 Apache CXF ,简称为 CXF. CXF 继承了 Celtix ...

  10. Xamarin iOS教程之显示和编辑文本

    Xamarin iOS教程之显示和编辑文本 Xamarin iOS显示和编辑文本 在一个应用程序中,文字是非常重要的.它就是这些不会说话的设备的嘴巴.通过这些文字,可以很清楚的指定这些应用程序要表达的 ...