8分钟学会使用AutoMapper

一.什么是AutoMapper与为什么用它。

它是一种对象与对象之间的映射器,让AutoMapper有意思的就是在于它提供了一些将类型A映射到类型B这种无聊的实例,只要B遵循AutoMapper已经建立的惯例,那么大多数情况下就可以进行相互映射了。

二.如何使用?

直接nuget install-package automapper 简单到不能再简单了。

三.入门

定义了连个简单的Model:

+


1

2

3

4

5

6

7

8

9

10

11

static void Main(string[] args)

        {

            Destination des = new Destination()

            {

                InfoUrl = "www.cnblogs.com/zaranet",

                name ="张子浩"

            };

            Mapper.Initialize(x => x.CreateMap<Destination, Source>());

            Source source = AutoMapper.Mapper.Map<Source>(des);

            Console.WriteLine(source.InfoUrl);

        }

  Initialize方法是Mapper的初始化,里面可以写上CreateMap表达式,具体是谁和谁进行匹配。在之后就可以直接进行一个获取值的过程了,非常的简单。

四.映射前后操作

偶尔有的时候你可能需要在映射的过程中,你需要执行一些逻辑,这是非常常见的事情,所以AutoMapper给我们提供了BeforeMap和AfterMap两个函数。


1

2

3

Mapper.Initialize(x => x.CreateMap<Destination, Source>().BeforeMap(

                (src,dest)=>src.InfoUrl ="https://"+src.InfoUrl).AfterMap(

                (src,dest)=>src.name="真棒"+src.name));

其中呢,src是Destination对象,dest是Source,你呢就可以用这两个对象去获取里面的值,说白了这就是循环去找里面的值了。

五.条件映射


1

Mapper.Initialize(x => x.CreateMap<Destination, Source>().ForMember(dest => dest.InfoUrl,opt => opt.Condition(dest => dest.InfoUrl == "www.cnblogs.com/zaranet1")).ForMember(...(.ForMember(...))));

在条件映射中,通过ForMember函数,参数是一个委托类型Fun<>,其里面呢也是可以进行嵌套的,但一般来说一个就够用了。

六.AutoMapper配置

初始化配置是非常受欢迎的,每个领域都应该配置一次。


1

2

3

4

5

//初始化配置文件

Mapper.Initialize(cfg =>

{

    cfg.CreateMap<Aliens, Person>();

});

 但是像这种情况呢,如果是多个映射,那么我们只能用Profile来配置,组织你的映射配置,并将配置放置到构造函数中(这种情况是5.x以上的版本),一个是以下的版本,已经被淘汰了。

5.0及以上版本:


1

2

3

4

5

6

7

public class AliensPersonProfile : Profile

    {

        public AliensPersonProfile()

        {

            CreateMap<Destination, Source>();

        }

    }

5.0以下版本(在早期版本中,使用配置方法而不是构造函数。 从版本5开始,Configure()已经过时。 它将在6.0中被删除。)


1

2

3

4

5

6

7

public class OrganizationProfile : Profile

{

    protected override void Configure()

    {

        CreateMap<Foo, FooDto>();

    }

}

 然后在程序启动的时候初始化即可。


1

Mapper.Initialize(x=>x.AddProfile<AliensPersonProfile>());

七.AutoMapper的最佳实践

上文中已经说到了AutoMapper的简单映射,但是在实际项目中,我们应该有很多类进行映射,这么多的映射应该怎么组织,这是一个活生生的问题,这成为主映射器。

在主映射器中,组织了多个小映射器,Configuration为我们的静态配置入口类;Profiles文件夹为我们所有Profile类的文件夹。如果是MVC,我们需要在Global中调用,那我的这个是控制台的。


1

2

3

4

5

6

7

8

public static void Configure()

        {

            Mapper.Initialize(cfg =>

            {

                cfg.AddProfile<DestinationSourceProfile>();

                cfg.AddProfile(new StudentSourceProfile());

            });

        }

其中添加子映射,可以用以上两种方式。


1

2

3

4

public void Configuration(IAppBuilder app)

        {

            AutoMapperConfiguration.Configure();

        }

八.指定映射字段

在实际业务环境中,你不可能说两个类的字段是一 一 对应的,这个时候我们就要对应它们的映射关系。


1

2

3

4

5

6

7

8

9

10

11

12

13

public class CalendarEvent

{

    public DateTime Date { getset; }

    public string Title { getset; }

}

public class CalendarEventForm

{

    public DateTime EventDate { getset; }

    public int EventHour { getset; }

    public int EventMinute { getset; }

    public string DisplayTitle { getset; }

}

在这两个类中,CalendarEvent的Date将被拆分为CalendarEventForm的日期、时、分三个字段,Title也将对应DisplayTitle字段,那么相应的Profile定义如下:


1

2

3

4

5

6

7

8

9

10

11

public class CalendarEventProfile : Profile

   {

       public CalendarEventProfile()

       {

           CreateMap<CalendarEvent, CalendarEventForm>()

          .ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.Date.Date))

          .ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.Date.Hour))

          .ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.Date.Minute))

          .ForMember(dest => dest.DisplayTitle, opt => opt.MapFrom(src => src.Title));

       }

   }

main方法通过依赖注入,开始映射过程,下图是代码和图。


1

2

3

4

5

6

7

8

9

10

11

static void Main(string[] args)

        {

            CalendarEvent calendar = new CalendarEvent()

            {

                Date = DateTime.Now,

                Title = "Demo Event"

            };

            AutoMapperConfiguration.Configure();

            CalendarEventForm calendarEventForm = Mapper.Map<CalendarEventForm>(calendar);

            Console.WriteLine(calendarEventForm);

        }   

  

那么最后呢,如果是反向的映射,一定回缺少属性,那么就你就可以obj.属性进行赋值。

附AutoHelper封装类


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

/// <summary>

    /// AutoMapper扩展帮助类

    /// </summary>

    public static class AutoMapperHelper

    {

        /// <summary>

        ///  类型映射

        /// </summary>

        public static T MapTo<T>(this object obj)

        {

            if (obj == nullreturn default(T);

            Mapper.CreateMap(obj.GetType(), typeof(T));

            return Mapper.Map<T>(obj);

        }

        /// <summary>

        /// 集合列表类型映射

        /// </summary>

        public static List<TDestination> MapToList<TDestination>(this IEnumerable source)

        {

            foreach (var first in source)

            {

                var type = first.GetType();

                Mapper.CreateMap(type, typeof(TDestination));

                break;

            }

            return Mapper.Map<List<TDestination>>(source);

        }

        /// <summary>

        /// 集合列表类型映射

        /// </summary>

        public static List<TDestination> MapToList<TSource, TDestination>(this IEnumerable<TSource> source)

        {

            //IEnumerable<T> 类型需要创建元素的映射

            Mapper.CreateMap<TSource, TDestination>();

            return Mapper.Map<List<TDestination>>(source);

        }

        /// <summary>

        /// 类型映射

        /// </summary>

        public static TDestination MapTo<TSource, TDestination>(this TSource source, TDestination destination)

            where TSource : class

            where TDestination : class

        {

           if (source == nullreturn destination;

            Mapper.CreateMap<TSource, TDestination>();

            return Mapper.Map(source, destination);

        }

        /// <summary>

        /// DataReader映射

        /// </summary>

        public static IEnumerable<T> DataReaderMapTo<T>(this IDataReader reader)

        {

            Mapper.Reset();

            Mapper.CreateMap<IDataReader, IEnumerable<T>>();

            return Mapper.Map<IDataReader, IEnumerable<T>>(reader);

        }

    }

}

原文地址:https://www.cnblogs.com/sexintercourse/p/12217725.html

时间: 2024-10-31 18:02:01

8分钟学会使用AutoMapper的相关文章

3 分钟学会调用 Apache Spark MLlib KMeans

Apache Spark MLlib是Apache Spark体系中重要的一块拼图:提供了机器学习的模块.不过,目前对此网上介绍的文章不是很多.拿KMeans来说,网上有些文章提供了一些示例程序,而这些程序基本和Apache Spark 官网上的程序片断类似:在得到训练模型后,几乎都没有展示如何使用该模型.程序执行流程.结果展示以及举例测试数据等部分.笔者根据Apache Spark官网上的程序片断,写了一个完整的调用MLlib KMeans库的测试程序,并成功在Spark 1.0 + Yarn

10分钟学会基于ASP.NET的 JQuery实例 (转)

本文介绍如何在ASP.NET(ASP.NET/AJAX)里使用基于JQuery的AJAX技术.(源代码下载见最后) 在使用JQuery前,请到www.jquery.com下载最新版本的js代码,然后再代码里使用 <script src="_scripts/jQuery-1.2.6.js" type="text/javascript"></script>即可,当然,由于微软已经把JQuery集成到VS里,所以你可以到WWW.ASP.NET/aj

十分钟学会Markdown(younghz原创)

younghz原创,转载请注明:http://blog.csdn.net/u012150179/article/details/26503779 原内容及代码托管在GitHub上,并持续更新,欢迎交流:https://github.com/younghz/Markdown 主要内容 MARKDOWN是什么? 谁发明可这么个牛X的东西? 为什么要使用它? 怎么使用? 都谁在用?没人用的东西我可不用. 感觉有意思?趁热打铁,推荐几个工具. 正文 1. MARKDOWN是什么? MARKDOWN是一种

三分钟学会 JavaScript 单元测试

此篇文章使用 js-test-driver , 希望给无任何JavaScript 单元测试经验的开发者, 能在最短的时间内, 开展单元测试的工作? 附件: 三分钟学会 JavaScript 单元测试

两分钟学会Unity3D布娃娃的使用

在RPG游戏中,为了让人物的死亡更加真实,unity创建布娃娃系统,搞的跟真的一样,尼玛我差点就相信那是真的了. 1.首先打开unity,创建地形,导入已经准备好的人物模块. 2.project下选中该模型,再为该模型添加布娃娃属性:GameObject->Create Other->RagDoll 3.在弹出的框中将布娃娃的各个结点设置进去 4.一定要去掉该人物的Box Collider属性,运行程序,就可以看到人物的死亡效果啦. 两分钟学会Unity3D布娃娃的使用,布布扣,bubuko.

【转载】【grunt整合版】30分钟学会使用grunt打包前端代码

[grunt整合版]30分钟学会使用grunt打包前端代码 grunt 是一套前端自动化工具,一个基于nodeJs的命令行工具,一般用于:① 压缩文件② 合并文件③ 简单语法检查 对于其他用法,我还不太清楚,我们这里简单介绍下grunt的压缩.合并文件,初学,有误请包涵 准备阶段 1.nodeJs环境 因为grunt是基于nodeJs的,所以首先各位需要安装nodeJS环境,这块我们便不管了http://www.cnblogs.com/yexiaochai/p/3527418.html 2.安装

PHP学习过程_Symfony_(3)_整理_十分钟学会Symfony

这篇文章主要介绍了Symfony学习十分钟入门教程,详细介绍了Symfony的安装配置,项目初始化,建立Bundle,设计实体,添加约束,增删改查等基本操作技巧,需要的朋友可以参考下 (此文章已被多人复制转载,原文为我们老板写的"十分钟学会Symfony",不过GItHub已经清理了,所以今天我重新整理一下,不过基本不变) Symfony是一个强大的基于PHP的Web开发框架,在这里我们用十分钟的时间来做一个简单的增删改查的程序, 任何不熟悉Symfony的人都可以通过这个教程完成自己

50分钟学会Laravel 50个小技巧

50分钟学会Laravel 50个小技巧 时间 2015-12-09 17:13:45  Yuansir-web菜鸟 原文  http://www.yuansir-web.com/2015/12/09/50分钟学会laravel-50个小技巧/ 主题 Laravel 转载请注明:转载自 Yuansir-web菜鸟 | LAMP学习笔记 本文链接地址: 50分钟学会Laravel 50个小技巧 原文链接:< 50 Laravel Tricks in 50 Minutes by willroth >

30分钟学会XAML

1.狂妄的WPF 相对传统的Windows图形编程,需要做很多复杂的工作,引用许多不同的API.例如:WinForm(带控件表单).GDI+(2D图形).DirectX API(3D图形)以及流媒体和流文档等,都需要不同的API来构建应用程序. WPF就是看着上面的操作复杂和不爽,自己决定做老大,想用DirectX技术涵盖一切,于是想要将上述的东西全部融合到自身,减少复杂度,让编程变得爽起来的技术. 而不可否认的是,WPF虽然很狂妄,但是这种技术里面还是有不少的可圈可点的东西.而支持WPF狂妄的