首页 > 编程语言 >ASP.NET Core MVC 从入门到精通之自动映射(一)

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

时间:2023-06-02 22:56:32浏览次数:56  
标签:Core ASP 映射 cfg MVC 自动 所示 NET

随着技术的发展,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。手动映射如下所示:

 1 [HttpPost]
 2 public IActionResult Add(StudentViewModel studentViewModel)
 3 {
 4     var student = new Student()
 5     {
 6         Id = studentViewModel.Id,
 7         Name = studentViewModel.Name,
 8         Age = studentViewModel.Age,
 9         Sex = studentViewModel.Sex,
10     };
11     studentService.Add(student);
12     return View();
13 }

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

自动映射快速入门

自动映射就是由程序自动匹配属性名并进行赋值。步骤如下:

1. 安装自动映射包

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

2. 创建自动映射关系

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

 1 using AutoMapper;
 2 using DemoCoreMVC.ViewModels;
 3 using DemoCoreMVC.Models;
 4 
 5 namespace DemoCoreMVC.Profiles
 6 {
 7     public class AutomapProfile:Profile
 8     {
 9         public AutomapProfile()
10         {
11             //创建映射关系
12             CreateMap<StudentViewModel, Student>();
13         }
14     }
15 }

3. 注册自动映射服务

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

1 builder.Services.AddAutoMapper(cfg =>
2 {
3     cfg.AddProfile<AutomapProfile>();
4 });
5 //或者
6 //builder.Services.AddAutoMapper(typeof(AutomapProfile));

4. 注入IMapper接口

在需要使用自动映射服务的地方注入IMapper服务,如控制器中,如下所示:

1 private readonly IMapper mapper;
2 
3 public StudentController(IStudentService studentService,IMapper mapper)
4 {
5     this.studentService = studentService;
6     this.mapper = mapper;
7 }

5. 调用映射方法

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

1 [HttpPost]
2 public IActionResult Add(StudentViewModel studentViewModel)
3 {
4     var student =  mapper.Map<StudentViewModel, Student>(studentViewModel);
5     studentService.Add(student);
6     return View();
7 }

6. 自动映射示例

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

多个关系映射文件

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

1 builder.Services.AddAutoMapper(cfg =>
2 {
3     cfg.AddProfile<AutomapProfile>();
4     cfg.AddProfile<CompanyProfile>();
5 });

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

1 builder.Services.AddAutoMapper(cfg =>
2 {
3     cfg.AddMaps("DemoCoreMVC");
4 });

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

自动映射匹配

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

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

 1 namespace DemoCoreMVC.Profiles
 2 {
 3     public class AutomapProfile:Profile
 4     {
 5         public AutomapProfile()
 6         {
 7             SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();
 8             DestinationMemberNamingConvention = new PascalCaseNamingConvention();
 9             //创建映射关系
10             CreateMap<StudentViewModel, Student>();
11         }
12     }
13 }

注意:其中

SourceMemberNamingConvention :源类型成员命名规则 Ex: SourceMemberNamingConvention = new LowerUnderscoreNamingConvention(); //下划线命名法 DestinationMemberNamingConvention :目标类型成员命名规则 Ex: cfg.DestinationMemberNamingConvention = new PascalCaseNamingConvention(); //帕斯卡命名法

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

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

1 builder.Services.AddAutoMapper(cfg =>
2 {
3     cfg.AddProfile<AutomapProfile>();
4     cfg.SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();
5     cfg.DestinationMemberNamingConvention = new PascalCaseNamingConvention();
6 });

以上就是ASP.NET Core MVC从入门到精通之自动映射第一部分内容。旨在抛砖引玉,一起学习,共同进步。

标签:Core,ASP,映射,cfg,MVC,自动,所示,NET
From: https://www.cnblogs.com/hsiang/p/17450526.html

相关文章

  • .net core IOC容器实现(一) -- ServiceDescriptor
    IOC容器内保存的程序运行过程中使用的服务实例。那么如果有些服务实例需要在运行时动态生成,比如,数据库连接,不可能在程序运行过程中所有线程共用一条数据库连接。所以IOC容器内保存的不是具体的服务实例,而是服务的相关信息,使用这个信息可以在程序运行时动态的生成服务实例,这些信......
  • 第一章 Web MVC简介
    WebMVC简介1.1、Web开发中的请求-响应模型: 在Web世界里,具体步骤如下:1、 Web浏览器(如IE)发起请求,如访问http://sishuok.com2、 Web服务器(如Tomcat)接收请求,处理请求(比如用户新增,则将把用户保存一下),最后产生响应(一般为html)。3、web服务器处理完成后,返回内容给web客户端(一般就是我......
  • linphone-linphonecore_jni.h文件分析
    说明linphone主要的功能逻辑基本都是C/C++语言实现的,这时候在Android端就必须要用到JNI了,这里并不是要分析JNI怎样使用的逻辑,这里有几篇文章是java部分JNI的官方说明。这份说明并没有怎样说怎么样配置Android的JNI环境,只是说了语法部分java-jni-01-Introductionjava-jni-02-Des......
  • Coremail与中科曙光达成战略合作 紧抓数字经济大机遇
    5月12日,广东盈世计算机科技有限公司(以下简称:Coremail)与曙光信息产业股份有限公司(以下简称:中科曙光)正式签约合作协议、达成战略合作伙伴关系。Coremail技术副总裁林延中、中科曙光副总裁郭莹等领导出席签约活动,并就未来合作进行了深入探讨。双方将在计算、存储、安全、数据中心等领......
  • .NET Core WebAPI 认证授权之JWT
    @@.NETCoreWebAPI认证授权之JWT--google from --->NETCoreWebAPI认证授权之JWT(二)  在上一篇 《.NET缓存系列(一):缓存入门》中实现了基本的缓存,接下来需要对缓存进行改进,解决一些存在的问题。一、缓存过期策略问 题:当源数据更改或删除时,服务器程序并不知道,导......
  • NET Core WebAPI 认证授权之JWT
    @@.netcoretoken非对称加密 --Google-->@@wepapi认证授权之jwt NETCoreWebAPI认证授权之JWT(二):HMAC算法实操  一、前言在上一篇 《.NETCoreWebAPI认证授权之JWT(一):JWT介绍》中讲到了JWT的组成,分为三部分,其中标头(header)和载荷(payload)都只是简单的将json......
  • net core 读取enum上的描述信息
    https://github.com/xin9le/FastEnum简单使用:enumCompany{[EnumMember(Value="Apple,Inc.")]Apple=0,}varvalue=Company.Apple.GetEnumMemberValue();//Apple,Inc.dotnetaddpackageFastEnumPM>Install-PackageFastEnum测试......
  • 怎样打造一个分布式数据库——rocksDB, raft, mvcc,本质上是为了解决跨数据中心的复制
    为什么我们要创建另外一个数据库?在前面三十年基本上是关系数据库的时代,那个时代创建了很多伟大的公司,比如说IBM、Oracle、微软也有自己的数据库,早期还有一个公司叫Sybase,有一部分特别老的程序员同学在当年的教程里面还可以找到这些东西,但是现在基本上看不到了。另外是NoSQL。NoS......
  • net core-jwt
    namespaceJWTWebApi.JWT;publicclassJwtOptions{///<summary>///签发者///</summary>publicstringIssuer{get;set;}///<summary>///接收者///</summary>publi......
  • SpringMVC大文件分片上传/多线程上传
    ​ javaweb上传文件上传文件的jsp中的部分上传文件同样可以使用form表单向后端发请求,也可以使用ajax向后端发请求    1.通过form表单向后端发送请求         <formid="postForm"action="${pageContext.request.contextPath}/UploadServlet"method="post"e......