请选择 进入手机版 | 继续访问电脑版

马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#问题入口 ASP.NET问题入口

【C#问题提交】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接毕业设计】 面试-葵花宝典下载

官方一群:

官方二群:

查看: 382|回复: 0

Dotnet Core中使用AutoMapper

[复制链接]
  • TA的每日心情
    开心
    前天 21:32
  • 签到天数: 1610 天

    [LV.Master]伴坛终老

    4251

    主题

    6177

    帖子

    11万

    积分

    管理员

    IBC编程社区-原道楠

    Rank: 9Rank: 9Rank: 9

    积分
    111382

    推广达人突出贡献优秀版主荣誉管理论坛元老

    发表于 2019-11-8 09:55:21 | 显示全部楼层 |阅读模式

    马上加入IBC,查看更多教程

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x

    官网:http://automapper.org/

    文档:https://automapper.readthedocs.io/en/latest/index.html

    GitHub:https://github.com/AutoMapper/AutoMapper/blob/master/docs/index.rst

    什么是AutoMapper?

      AutoMapper是一个对象-对象映射器。对象-对象映射通过将一种范例的输入对象转换为另一种范例的输出对象来工作。使AutoMapper变得风趣的是,它提供了一些风趣的约定,以免除搞清楚怎样将范例A映射为范例B。只要范例B遵照AutoMapper既定的约定,就须要险些零设置来映射两个范例。

    为什么要利用AutoMapper?

      映射代码很无聊。测试映射代码更加无聊。AutoMapper提供了简单的范例设置以及简单的映射测试。真正的标题大概是“为什么利用对象-对象映射?”映射可以在应用步伐中的许多地方发生,但主要发生在层之间的边界中,比方UI /域层或服务/域层之间。一层的关注点通常与另一层的关注点辩论,因此对象-对象映射导致分离的模子,此中每一层的关注点仅会影响该层中的范例。

    AutoMapper的利用场景:

      AutoMapper是对象到对象的映射工具。在完成映射规则之后,AutoMapper可以将源对象转换为目的对象。
    一样平常环境下,表现层与应用层之间是通过DTO(数据传输对象Data Transfer Object)来举行交互的,数据传输对象是没有活动的POCO对象(简单CLR对象Plain Old CLR Object),他的目的是为了对范畴对象举行数据封装,实现层与层之间的数据转达。为何不直接将范畴对象举行数据转达?由于范畴对象更注意范畴,DTO更注意数据。由于“富范畴模子”的特点,如许会直接将范畴对象的活动袒露给表现层。
    DTO自己不是业务对象,它是根据UI需求举行筹划的。简单来说Model面向业务,我们是通过业务来界说Model的。而DTO是面向UI,通过UI的需求来界说的,通过DTO我们实现了表现层与Model层之间的解耦,表现层不引用Model。如果开辟过程中我们的模子变了,而界面没变,我们只需改Model而不须要去改动表现层。

    怎样利用AutoMapper?

      首先,您须要同时利用源范例和目的范例。目的范例的筹划大概会受到其所在层的影响,但是只要成员名称与源范例的成员匹配,AutoMapper的效果最佳。如果您有一个名为“ FirstName”的源成员,它将自动映射到名称为“ FirstName”的目的成员。AutoMapper还支持Flattening

      将源映射到目的时,AutoMapper将忽略空引用非常。这是筹划使然。如果您不喜欢这种方法,则可以根据须要将AutoMapper的方法与自界说值剖析器联合利用。

    怎样在Dotnet Core中利用AutoMapper?

    首先,要安装依赖包:

    095611gf63u64i3h6y6wu6.png

    在Startup.cs中利用Dotnet Core自带的容器举行注入,由于我内里是示例代码,新建的示例Demo也没有去改名字,也都是在同一个定名空间下的,但是在现实项目中是不会出现这种标题的

    1. //添加对AutoMapper的支持
    2. services.AddAutoMapper(Assembly.Load("WebApplication1"), Assembly.Load("WebApplication1"));
    复制代码

    095612uagq76a70kzd04w1.png

    即下图所示的关系:

    095612cyyh1yq9dgdrefyy.png

    源范例Model对象,与映射后的DTO范例:

    1. public class UserInfo
    2. {
    3. public string UserName { get; set; }
    4. public string UserPwd { get; set; }
    5. public string GetCreateTime { get; set; }
    6. }
    复制代码
    1. public class UserInfoDTO
    2. {
    3. public string UserName { get; set; }
    4. public string UserPwd { get; set; }
    5. public string Role { get; set; }
    6. public DateTime CreateTime { get; set; }
    7. public string TestTime { get; set; }
    8. }
    复制代码

    Profile的用法:

      Profile提供了一个定名的映射类,所有继承自Profile类的子类都是一个映射集合。这里我们创建一个UserProfile继承Profile类。

      CreateMap:创建映射规则。

      BeforeMap:在映射之前实行的方法。

      AfterMap:反之,映射之后实行的方法。

      自动化扁平映射:AutoMapper会将类中的属性举行分割,或匹配"Get"开头的方法。

      ForMember:指定映射字段。

    1. public class UserProfile : Profile
    2. {
    3. //添加你的遗体映射关系
    4. public UserProfile()
    5. {
    6. CreateMap<UserInfo, UserInfoDTO>()
    7. .BeforeMap((source, dto) =>
    8. {
    9. //可以较为正确的控制输出数据格式
    10. if (string.IsNullOrEmpty(source.GetCreateTime))
    11. {
    12. source.GetCreateTime = Convert.ToDateTime(source.GetCreateTime).ToString("yyyy-MM-dd");
    13. }
    14. })
    15. //指定映射字段。将UserInfo.GetCreateTime映射到UserInfoDTO.TestTime
    16. .ForMember(dto => dto.TestTime, opt => opt.MapFrom(info => info.GetCreateTime))
    17. .ForMember(dto => dto.Role, opt => opt.Ignore())
    18. .ForMember(dto => dto.CreateTime, opt => opt.Ignore());
    19. CreateMap<StudentInfo, UserInfo>();
    20. }
    21. }
    复制代码

    控制器注入IMapper:

    1. private readonly IMapper _mapper;
    2. public HomeController(IMapper mapper)
    3. {
    4. _mapper = mapper;
    5. }
    复制代码

    单个对象转DTO:

    1. //模拟数据
    2. var user = new UserInfo()
    3. {
    4. UserName = "bingle",
    5. UserPwd = "12345"
    6. };
    7. var userDto = _mapper.Map<UserInfoDTO>(user);
    复制代码

    集合转Dto集合:

    1. //模拟数据
    2. var userList = new List<UserInfo>
    3. {
    4. new UserInfo
    5. {
    6. UserName="bingle_1",
    7. UserPwd="1"
    8. },
    9. new UserInfo
    10. {
    11. UserName="bingle_2",
    12. UserPwd="2"
    13. },
    14. new UserInfo
    15. {
    16. UserName="bingle_3",
    17. UserPwd="3"
    18. },
    19. new UserInfo
    20. {
    21. UserName="bingle_4",
    22. UserPwd="4"
    23. },
    24. new UserInfo
    25. {
    26. UserName="bingle_5",
    27. UserPwd="5"
    28. },
    29. new UserInfo
    30. {
    31. UserName="bingle_6",
    32. UserPwd="6"
    33. }
    34. };
    35. //对象集合转Dto集合
    36. var usersDtos = _mapper.Map<List<UserInfoDTO>>(userList);
    复制代码

      AutoMapper功能很强盛,在这边先容的只是很少的功能,有爱好的同伴可以去AutoMapper官方文档深入学习。

      如果有小同伴觉得在利用AutoMapper都得在Controller的构造函数中举行注入一遍贫苦的话,AutoMapper也是支持这种映射方式如:Mapper.Map

    实例方式:

    1. //模拟数据
    2. var user = new UserInfo()
    3. {
    4. UserName = "bingle",
    5. UserPwd = "12345"
    6. };
    7. var config = new MapperConfiguration(cfg => cfg.CreateMap<UserInfo, UserInfoDTO>());
    8. var mapper = config.CreateMapper();
    9. var userDTO = mapper.Map<UserInfoDTO>(user);
    复制代码

    参考:https://blog.csdn.net/weixin_37207795/article/details/81009878

    C#论坛 www.ibcibc.com IBC编程社区
    C#
    C#论坛
    IBC编程社区
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则