AutoMapper学习

AutoMapper学习http://automapper.org/这是一款DTO的映射工具,AutoMapper是基于对象到对象约定的映射工具,它可以把复杂的对象模型转为DTO,或者其他的–那些让设计更合理更适于序列化、通信、传递消息的简单对象或者干脆就只是在领域层与应用层之间搭建一个简单的ACL防护层(就像DTO一样,用于代码的显示转换)来增加各自层的相互独立性。简单来说就是:就是根据A的模型和B的模型中的定义,自动将A模型映射为一个全新的B模型。前言VO、DTO、DO、PO、DAOVO(ViewObject.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

http://automapper.org/
这是一款DTO的映射工具,AutoMapper是基于对象到对象约定的映射工具,它可以把复杂的对象模型转为DTO,或者其他的–那些让设计更合理更适于序列化、通信、传递消息的简单对象或者干脆就只是在领域层与应用层之间搭建一个简单的ACL防护层(就像DTO一样,用于代码的显示转换)来增加各自层的相互独立性。

简单来说就是:就是根据A的模型和B的模型中的定义,自动将A模型映射为一个全新的B模型。

前言

VO、DTO、DO、PO、DAO

  • VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
  • DTO(Data Transfer Object):数据传输对象,泛指用于展示层与服务层之间的数据传输对象。
  • DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。
  • PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。
  • DAO(Data Access Object):数据访问对象,主要用来封装对数据库的操作。

为什么要有DTO

通常我们通过DAO获取POPO是和数据库映射的,但是可能包含了很多对于传输来说并不需要的属性。

比如一张表有100个字段,那么对应的PO可能就是100个属性,但是对于表示层而言并不需要那么多属性展示给用户,同样的也不应该把底层表结构暴露给表示层,那么中间就有一个DTO对象的转换,表示层需要多少属性则DTO的设置就定义多少属性。

应用场景

人工转换

我们经常需要有这样的转换,将PO模型转换为实际传递需要的DTO模型,如果人工方式实现就会有一堆如下繁琐、效率低下的代码:

    class Program
    { 
   
        static void Main(string[] args)
        { 
   
            // PO->DTO 的人工转换
            StudentPO po = new StudentPO() { 
    ID = 1, FirstName = "Money", LastName = "Wang", Password = "admin", UserID = "imwyw" };
            StudentDTO dto = new StudentDTO()
            { 
   
                FirstName = po.FirstName,
                LastName = po.LastName,
                UserID = po.UserID
            };
        }
    }
    /// <summary>
    /// Persistence Object
    /// 模拟PO,库表映射对象
    /// </summary>
    public class StudentPO
    { 
   
        public int ID { 
    get; set; }
        public string FirstName { 
    get; set; }
        public string LastName { 
    get; set; }
        public int Sex { 
    get; set; }
        public DateTime Birth { 
    get; set; }
        public string UserID { 
    get; set; }
        public string Password { 
    get; set; }
        public string Address { 
    get; set; }
    }
    /// <summary>
    /// DTO Data Transport Object 数据传输对象
    /// 轻量级,并不是PO的所有属性
    /// </summary>
    public class StudentDTO
    { 
   
        public string FirstName { 
    get; set; }
        public string LastName { 
    get; set; }
        public string UserID { 
    get; set; }
    }

Jetbrains全家桶1年46,售后保障稳定

AutoMapper安装

同样,我们通过NuGet程序包管理器进行安装引用:
在这里插入图片描述

默认映射

AutoMapper uses a convention-based matching algorithm to match up source to destination values.
在使用AutoMapper进行映射对象前,还需要initialize AutoMapper,参考官网提欧的方法:

http://automapper.readthedocs.io/en/latest/Static-and-Instance-API.html
我们以官网中提供的static api作为示例:

class Program
{ 
   
    static void Main(string[] args)
    { 
   
        MapperInit();
        StudentPO po = new StudentPO() { 
    ID = 1, FirstName = "Money", LastName = "Wang", Password = "admin", UserID = "imwyw" };
        //使用Mapper 将po转换为dto
        StudentDTO dto1 = AutoMapper.Mapper.Map<StudentPO, StudentDTO>(po);
        //使用Mapper 将dto转换为po,没有的属性赋默认值
        StudentPO po1 = AutoMapper.Mapper.Map<StudentDTO, StudentPO>(new StudentDTO() { 
    FirstName = "First", LastName = "Last", UserID = "samsung" });
    }
    /// <summary>
    /// Mapper初始化,在程序启动的时候进行一次初始化
    /// You now must use either Mapper.Initialize or new MapperConfiguration() to initialize AutoMapper. 
    /// If you prefer to keep the static usage, use Mapper.Initialize.
    /// </summary>
    static void MapperInit()
    { 
   
        //static api 我们使用静态方法进行初始化
        AutoMapper.Mapper.Initialize(cfg =>
        { 
   
            cfg.CreateMap<StudentPO, StudentDTO>();
            cfg.CreateMap<StudentDTO, StudentPO>();
        });
        //在程序启动时对所有的配置进行严格的验证
        AutoMapper.Mapper.AssertConfigurationIsValid();
    }
}
/// <summary>
/// Persistence Object
/// 模拟PO,库表映射对象
/// </summary>
public class StudentPO
{ 
   
    public int ID { 
    get; set; }
    public string FirstName { 
    get; set; }
    public string LastName { 
    get; set; }
    public int Sex { 
    get; set; }
    public DateTime Birth { 
    get; set; }
    public string UserID { 
    get; set; }
    public string Password { 
    get; set; }
    public string Address { 
    get; set; }
}
/// <summary>
/// DTO Data Transport Object 数据传输对象
/// 轻量级,并不是PO的所有属性
/// </summary>
public class StudentDTO
{ 
   
    public string FirstName { 
    get; set; }
    public string LastName { 
    get; set; }
    public string UserID { 
    get; set; }
}

Reverse Mapping

反向映射,在上述的示例中,进行了PO->DTODTO->PO转换的映射,我们也可以通过反向映射来代替:

//static api 我们使用静态方法进行初始化
AutoMapper.Mapper.Initialize(cfg =>
{ 
   
    cfg.CreateMap<StudentPO, StudentDTO>().ReverseMap();
    //cfg.CreateMap<StudentDTO, StudentPO>(); 不再需要
});

Customizing reverse mapping

默认的映射有时候可能并不符合我们的需求,对于以下属性名称并不相同的映射需求,我们可以ForMember()自定义映射关系:

class Program
{ 
   
    static void Main(string[] args)
    { 
   
        AutoMapper.Mapper.Initialize(cfg =>
        { 
   
            cfg.CreateMap<StudentPO, StudentDTO>()
            .ForMember(des => des.EnName, op => op.MapFrom(src => src.ZhName))
            //.ForMember("EnName", op => op.MapFrom(src => src.ZhName)) ForMember重载,作用同上
            .ReverseMap();
        });
        StudentDTO dto = AutoMapper.Mapper.Map<StudentPO, StudentDTO>(new StudentPO() { 
    ZhName = "杰克" });
        StudentPO po = AutoMapper.Mapper.Map<StudentDTO, StudentPO>(new StudentDTO() { 
    EnName = "jack" });
    }
}
public class StudentPO
{ 
   
    public string ZhName { 
    get; set; }
}
public class StudentDTO
{ 
   
    public string EnName { 
    get; set; }
}

在映射对象时,我们还可以进行自定义的投影操作,可以在lambda表达式中定义我们需要的任意投影需要:

class Program
{ 
   
    static void Main(string[] args)
    { 
   
        AutoMapper.Mapper.Initialize(cfg =>
        { 
   
            cfg.CreateMap<BirthInfo, BirthDto>()
            .ForMember(des => des.BirthYear, op => op.MapFrom(src => src.Birth.Year))
            .ForMember(des => des.BirthMonth, op => op.MapFrom(src => src.Birth.Month))
            .ForMember(des => des.BirthDay, op => op.MapFrom(src => src.Birth.Day));
        });
        BirthDto dto = AutoMapper.Mapper.Map<BirthInfo, BirthDto>(new BirthInfo() { 
    Name = "Jack", Birth = Convert.ToDateTime("1900-9-19") });
    }
}
public class BirthInfo
{ 
   
    public string Name { 
    get; set; }
    public DateTime Birth { 
    get; set; }
}
public class BirthDto
{ 
   
    public string Name { 
    get; set; }
    public int BirthYear { 
    get; set; }
    public int BirthMonth { 
    get; set; }
    public int BirthDay { 
    get; set; }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200837.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • centos7 command not found_centos7 failed to start LSB

    centos7 command not found_centos7 failed to start LSB在进行CentOS最小化安装后,会发现lspci命令不好使。其实是因为相应的软件包没有安装。在终端中执行下列命令:$yumwhatprovides*/lspci将会得到如下的显示内容pciutils-3.1.4-9.el6.x86_64:PCIbusrelatedutilitiesRepo:baseMatchedfrom:Filename…

    2025年10月15日
    3
  • pycharm2022.01 linux激活码[最新免费获取]

    (pycharm2022.01 linux激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年4月1日
    203
  • LeetCode报错:AddressSanitizer:DEADLYSIGNAL详细分析与解决

    LeetCode报错:AddressSanitizer:DEADLYSIGNAL详细分析与解决LeetCode报错:AddressSanitizer:DEADLYSIGNAL详细分析与解决问题描述问题分析实例分析更多总结见:C刷题:LeetCode刷题踩坑常见BUG总结问题描述报错:AddressSanitizer:DEADLYSIGNAL,详细如下===42====ERROR:AddressSanitizer:SEGVonunknownaddressxx.ThesignaliscausedbyaREADmemoryaccess.问题分析一般可能主要有

    2025年8月5日
    3
  • noip2014普及组初赛答案_观光3路公交车路线

    noip2014普及组初赛答案_观光3路公交车路线风景迷人的小城Y市,拥有n个美丽的景点。由于慕名而来的游客越来越多,Y市特意安排了一辆观光公交车,为游客提供更便捷的交通服务。观光公交车在第0分钟出现在1号景点,随后依次前往2、3、4……n号景点。从第i号景点开到第i+1号景点需要Di分钟。任意时刻,公交车只能往前开,或在景点处等待。设共有m个游客,每位游客需要乘车1次从一个景点到达另一个景点,第i位游客在Ti分钟来到景点Ai,希望乘车前往景点Bi(Ai

    2022年9月24日
    1
  • 【《重构 改善既有代码的设计》学习笔记7】在对象之间搬移特性「建议收藏」

    本篇文章的内容来自《重构 改善既有代码的设计》一书学习笔记整理并且加上自己的浅显的思考总结!在对象之间搬移特性,核心就是: 决定把责任放在哪儿,重点关注责任,也就是尽量一个类之处理一类事情,或者是某个责任和这个类关系不大,就将此责任移动到关系大的类中。本篇内容两两放在一起,互相对比学习。也更方便理解和记忆。1、搬移函数(Move Method)&amp; 搬移字段(Move field…

    2022年2月27日
    36
  • navicat premium 15激活码 mac【2021免费激活】[通俗易懂]

    (navicat premium 15激活码 mac)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~747EFQ8BIF-eyJsaWNlb…

    2022年3月31日
    89

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号