架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 16026|回复: 0

[资料] AutoMapper对象之间的转换教程[源码]

[复制链接]
发表于 2017-6-14 16:09:44 | 显示全部楼层 |阅读模式
QQ截图20170614160335.jpg

什么是AutoMapper?

AutoMapper是一个对象和对象间的映射器。对象与对象的映射是通过转变一种类型的输入对象为一种不同类型的输出对象工作的。让AutoMapper有意思的地方在于它提供了一些将类型A映射到类型B这种无聊的事情的有趣惯例。只要类型B遵守AutoMapper已经建立的惯例,大多数情况下,映射两种类型零配置就可以了。

为什么使用AutoMapper?

映射代码是无聊的。测试映射代码更无聊。AutoMapper提供了一些简单配置,还有一些简单的映射测试。真正的问题可能是“为什么使用对象-对象的映射呢”?映射可能发生在一个应用的许多地方,但大多数情况下都发生在层与层之间的边界,比如UI/Domain层之间,或者Service/Domain层之间。关注一层通常和关注另一层发生冲突,因此对象-对象间的映射来隔离模型model,这样就只会影响每一层关注的类型。


我自己写的一个例子,例子中有:

1:int和string的转换
2:int?和int的转换
3:枚举和string的转换
4:对象和string的转换
等等

源对象:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;

  5. namespace AutoMapperDemo
  6. {
  7.     public class Domain
  8.     {
  9.         /// <summary>
  10.         /// 姓名
  11.         /// </summary>
  12.         public String Name { get; set; }

  13.         /// <summary>
  14.         /// 年龄
  15.         /// </summary>
  16.         public int Age { get; set; }

  17.         /// <summary>
  18.         /// 身高
  19.         /// </summary>
  20.         public int Stature { get; set; }

  21.         /// <summary>
  22.         /// 体重
  23.         /// </summary>
  24.         public int? Weight { get; set; }

  25.         /// <summary>
  26.         /// 性别
  27.         /// </summary>
  28.         public Sex Sex { get; set; }

  29.         /// <summary>
  30.         /// 车辆信息
  31.         /// </summary>
  32.         public Car Car { get; set; }

  33.         /// <summary>
  34.         /// 个人网站
  35.         /// </summary>
  36.         public String Url { get; set; }

  37.         
  38.     }

  39.     public enum Sex
  40.     {
  41.         男,女
  42.     }

  43.     public class Car
  44.     {
  45.         /// <summary>
  46.         /// 车牌
  47.         /// </summary>
  48.         public String VehicleNo { get; set; }

  49.         /// <summary>
  50.                 /// 车牌颜色
  51.                 /// </summary>
  52.                 public String PlateColor { get; set; }

  53.         /// <summary>
  54.         /// 核定载客位
  55.         /// </summary>
  56.         public int Seats { get; set; }
  57.     }
  58. }
复制代码


目标对象:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;

  5. namespace AutoMapperDemo
  6. {
  7.     public class WebModel
  8.     {
  9.         public String Name { get; set; }
  10.         public int age { get; set; }

  11.         public String stature { get; set; }

  12.         public int weight { get; set; }

  13.         public String Sex { get; set; }

  14.         public String Car { get; set; }

  15.         public string AnotherValue { get; set; }

  16.         public String Site { get; set; }
  17.     }
  18. }
复制代码


转换代码如下:

  1. using AutoMapper;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;

  6. namespace AutoMapperDemo
  7. {
  8.     class Program
  9.     {
  10.         //In 4.2.1 version of AutoMapper and later, AutoMapper provides two APIs: a static and an instance API.The static API:
  11.         //Mapper.Initialize(cfg => {
  12.         //cfg.AddProfile<AppProfile>();
  13.         //cfg.CreateMap<Source, Dest>();
  14.         //});

  15.         //var dest = Mapper.Map<Source, Dest>(new Source());
  16.         //And the instance API:

  17.         //var config = new MapperConfiguration(cfg => {
  18.         //cfg.AddProfile<AppProfile>();
  19.         //cfg.CreateMap<Source, Dest>();
  20.         //});

  21.         //var mapper = config.CreateMapper();
  22.         //// or
  23.         //IMapper mapper = new Mapper(config);
  24.         //var dest = mapper.Map<Source, Dest>(new Source());

  25.         static void Main(string[] args)
  26.         {
  27.             Mapper.Initialize(x => x.AddProfile<SourceProfile>());
  28.             //Mapper.Initialize(cfg => cfg.CreateMap<Order, OrderDto>());
  29.             Domain model = new Domain()
  30.             {
  31.                 Name = "架构师",
  32.                 Age = 3,
  33.                 Stature = 175,
  34.                 Sex = Sex.男,
  35.                 Car = new Car()
  36.                 {
  37.                     VehicleNo = "沪A8888",
  38.                     PlateColor = "黄色",
  39.                     Seats = 6
  40.                 },
  41.                 Url = "http://www.itsvse.com"
  42.             };

  43.             Mapper.CreateMap<Domain, WebModel>().ForMember(x => x.Site, y => { y.MapFrom(src => src.Url); });
  44.             //int转string
  45.             Mapper.CreateMap<int, String>().ConvertUsing((intNum, context) => intNum.SourceValue.ToString());
  46.             //string转int
  47.             Mapper.CreateMap<string, int>().ConvertUsing((context, intNum) => Convert.ToInt32(context.SourceValue));
  48.             var entity = Mapper.Map<Domain, WebModel>(model);
  49.             //简写
  50.             //var entity = Mapper.Map<WebModel>(model);
  51.             //验证目标属性是否都被映射,如果存在未被映射的属性,则抛出异常。
  52.             //Mapper.AssertConfigurationIsValid();
  53.             Console.WriteLine(entity.Name);
  54.             Console.WriteLine(entity.age);
  55.             Console.WriteLine(entity.stature);
  56.             Console.WriteLine(entity.weight);
  57.             Console.WriteLine(entity.Sex);
  58.             Console.WriteLine(entity.Car);
  59.             Console.WriteLine(entity.Site);
  60.             Console.ReadKey();
  61.         }

  62.         /// <summary>
  63.         /// 指定对象转int
  64.         /// </summary>
  65.         public class CarTypeConverter : ITypeConverter<Car, String>
  66.         {
  67.             public string Convert(ResolutionContext context)
  68.             {
  69.                 return (context.SourceValue as Car) == null ? null : (context.SourceValue as Car).VehicleNo;
  70.             }
  71.         }

  72.         public class SourceProfile : Profile
  73.         {
  74.             protected override void Configure()
  75.             {
  76.                 //自定义类型转换
  77.                 Mapper.CreateMap<Car, String>().ConvertUsing<CarTypeConverter>();
  78.             }
  79.         }
  80.     }
  81. }
复制代码


源码下载:

游客,如果您要查看本帖隐藏内容请回复





上一篇:AutoMapper 类型转换报错解决办法
下一篇:IIS 7 应用程序池自动回收关闭的解决方案
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2025-1-17 02:04

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表