分享

ASP.NET Core MVC 从入门到精通之自动映射(一)

 老码识途 2023-10-10 发布于广东

随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。经过前几篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启动运行,以及命名约定,创建控制器,视图,模型,接收参数,传递数据ViewData,ViewBag,路由,页面布局,wwwroot和客户端库,Razor语法,EnityFrameworkCore与数据库,HttpContext,Request,Response,Session,序列化,文件上传等内容,今天继续讲解ASP.NET Core MVC 中自动映射等相关内容,仅供学习分享使用。

手动映射

在实际应用中,随着程序复杂度越来越高,分层已经是必然趋势,对象的传递与映射,也变得很频繁。在小项目中,一般采用手动映射赋值,如:将StudentViewModel对象的属性值赋值给Student。手动映射如下所示:

[HttpPost]public IActionResult Add(StudentViewModel studentViewModel){    var student = new Student()    {        Id = studentViewModel.Id,        Name = studentViewModel.Name,        Age = studentViewModel.Age,        Sex = studentViewModel.Sex,    };    studentService.Add(student);    return View();}

手动映射需要逐个属性进行赋值,灵活度高,但也容易出错。如果项目中存在很多需要映射传递的地方,则工作量和复杂度也会随之增加。

自动映射快速入门

自动映射就是由程序自动匹配属性名并进行赋值,一般使用AutoMapper库完成。AutoMapper是一个对象和对象间的映射器。对象映射就是将A对象的属性映射到B对象的属性值。步骤如下:

1. 安装自动映射包

通过NuGet包管理器安装自动映射第三方库【AutoMapper.Extensions.Microsoft.DependencyInjection】,目前版本为12.0.1,如下所示:

2. 创建自动映射关系

创建自动映射关系类AutomapProfile,并继承自Profile,如下所示:

using AutoMapper;using DemoCoreMVC.ViewModels;using DemoCoreMVC.Models;
namespace DemoCoreMVC.Profiles{ public class AutomapProfile:Profile { public AutomapProfile() { //创建映射关系 CreateMap<StudentViewModel, Student>(); } }}

3. 注册自动映射服务

在Program启动文件中,添加自动映射服务,在服务中添加映射关系类,如下所示:

builder.Services.AddAutoMapper(cfg =>{    cfg.AddProfile<AutomapProfile>();});//或者//builder.Services.AddAutoMapper(typeof(AutomapProfile));

4. 注入IMapper接口

在需要使用自动映射功能的地方注入IMapper接口,如控制器,如下所示:

private readonly IMapper mapper;
public StudentController(IStudentService studentService,IMapper mapper){ this.studentService = studentService; this.mapper = mapper;}

5. 调用映射方法

在需要映射的地方调用IMapper接口的Map方法,如下所示:

[HttpPost]public IActionResult Add(StudentViewModel studentViewModel){    var student =  mapper.Map<StudentViewModel, Student>(studentViewModel);    studentService.Add(student);    return View();}

6. 自动映射示例

经过上述步骤,自动映射已经完成,经过测试如下所示:

多个关系映射文件

在实际应用中,会有很多对象需要映射,通常会根据不同的类型,创建多个关系映射类,则在项目启动注册自动映射服务时,需要加载多个映射类,如下所示:

builder.Services.AddAutoMapper(cfg =>{    cfg.AddProfile<AutomapProfile>();    cfg.AddProfile<CompanyProfile>();});

也可以通过扫描程序集的方式加载映射文件,可以配置程序集名称,程序会自动扫描继承了Profile类的文件。如下所示:

builder.Services.AddAutoMapper(cfg =>{    cfg.AddMaps("DemoCoreMVC");});

注意:AddMaps参数配置的是程序集名称,而不是命名空间,程序集名称可通过项目属性获取,如下所示:

自动映射命名规则

默认情况下,自动映射的数据源和目标的属性,必须要一致,才能进行映射,但是在实际应用中,属性名之间可能会存在差异,如书写格式【Class_Name和ClassName之间的差异】等,如果不加处理的话,默认是无法自动映射成功的。失败示例如下所示:

 在映射时进行配置源的命名格式和目标命名格式,如下所示:

namespace DemoCoreMVC.Profiles{    public class AutomapProfile:Profile    {        public AutomapProfile()        {            SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();            DestinationMemberNamingConvention = new PascalCaseNamingConvention();            //创建映射关系            CreateMap<StudentViewModel, Student>();        }    }}

注意:其中

    • SourceMemberNamingConvention :源类型成员命名规则

    • Ex:SourceMemberNamingConvention=new LowerUnderscoreNamingConvention(); //下划线命名法

    • DestinationMemberNamingConvention :目标类型成员命名规则

    • Ex:cfg.DestinationMemberNamingConvention=new PascalCaseNamingConvention(); //帕斯卡命名法

经过设置源类型和目标类型的命名规则后,则发现已经可以适配成功。如下所示:

 经过测试,以下全局配置命名规则不生效,具体原因不知:

builder.Services.AddAutoMapper(cfg =>{    cfg.AddProfile<AutomapProfile>();    cfg.SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();    cfg.DestinationMemberNamingConvention = new PascalCaseNamingConvention();});

以上就是ASP.NET Core MVC从入门到精通之自动映射第一部分内容。

关于ASP.NET Core MVC 从入门到精通其他文章,可通过以下链接查看:

ASP.NET Core MVC 从入门到精通之初窥门径

ASP.NET Core MVC 从入门到精通之接化发(一)

ASP.NET Core MVC 从入门到精通之接化发(二)

ASP.NET Core MVC 从入门到精通之路由

ASP.NET Core MVC 从入门到精通之布局

ASP.NET Core MVC 从入门到精通之wwwroot和客户端库

ASP.NET Core MVC 从入门到精通之Razor语法

ASP.NET Core MVC 从入门到精通之数据库

ASP.NET Core MVC 从入门到精通之HttpContext

ASP.NET Core MVC 从入门到精通之序列化

ASP.NET Core MVC 从入门到精通之文件上传


学习编程,从关注【老码识途】开始!!!

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多