当前位置: 首页 > news >正文

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

随着技术的发展,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();
}

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

自动映射快速入门

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

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 从入门到精通之自动映射(一)

随着技术的发展&#xff0c;ASP.NET Core MVC也推出了好长时间&#xff0c;经过不断的版本更新迭代&#xff0c;已经越来越完善&#xff0c;本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容&#xff0c;适用于初学者&#xff0c;在校毕业生&#xff0c…...

4. WebGPU 存储缓冲区 (WebGPU Storage Buffers)

这篇文章是关于存储缓冲区的&#xff0c;我们从上一篇文章暂停的地方继续。 存储缓冲区在许多方面类似于统一缓冲区。如果我们所做的只是将 JavaScript 中的 UNIFORM 更改为 STORAGE 并将 WGSL 中的 var 更改为 var<storage, read> &#xff0c;那么上一页中的示例就可以…...

ChatGPT 插件功能深度解析:acquire、scholarai、form

引言 在我们的日常工作中&#xff0c;插件扮演着重要的角色&#xff0c;它们可以帮助我们提高工作效率&#xff0c;简化复杂的任务。在这篇文章中&#xff0c;我将详细介绍三个非常实用的插件&#xff1a;acquire、scholarai和form。 1、acquire 插件详解 acquire插件是一个…...

【面试集锦 - 汽车电子 - ASPICE]

ASPICE ASPICE&#xff08;Automotive Software Performance Improvement and Capability dEtermination&#xff09;是一种针对汽车电子行业的软件过程评估和改进模型。它是一种国际标准&#xff0c;旨在帮助汽车制造商和供应商评估和改进其软件开发过程的能力&#xff0c;以…...

深入探索Vue.js响应式原理及其实现机制

导语&#xff1a;Vue.js的核心特性之一是其强大的响应式系统&#xff0c;它使得数据和视图能够自动保持同步。在本文中&#xff0c;我们将深入探索Vue.js的响应式原理及其实现机制&#xff0c;帮助您更好地理解Vue.js的工作方式。 数据劫持&#xff1a;Vue.js的响应式系统通过数…...

Spark SQL概述、数据帧与数据集

文章目录 一、准备工作1、准备数据文件2、启动Spark Shell 二、加载数据为Dataset1、读文件得数据集 三、给数据集添加元数据信息1、定义学生样例类2、导入隐式转换3、将数据集转换成学生数据集4、对学生数据集进行操作&#xff08;1&#xff09;显示数据集内容&#xff08;2&a…...

c# cad 二次开发 类库 CAD表格的操作,给CAD添加一个表格

c# cad 二次开发 类库 CAD表格的操作&#xff0c;给CAD添加一个表格 using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.Colors; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using A…...

单点登录的两种实现方式,分别有啥优缺点?

单点登录&#xff08;Single Sign-On&#xff0c;简称SSO&#xff09;是指在多个应用系统中&#xff0c;用户只需要登录一次&#xff0c;就可以访问所有已授权的系统资源的一种身份认证技术。SSO可以提升用户体验&#xff0c;减少用户密码管理工作量&#xff0c;并加强安全管理…...

opencv_c++学习(二十七)

一、单目相机模型 上图为针孔相机成像原理&#xff0c;蓝色坐标中的O即为镜头光心。成像原理与小孔成像相同。 单目相机映射关系如下&#xff1a; 将上式进行变换&#xff0c;就可以从三位空间映射到2维平面的公式。 相机的畸变公式如下&#xff1a; 二、模型投影函数 vo…...

探查chatGPT插件:Outschool,resume,webhooks

引言 在我们的日常工作和学习中&#xff0c;插件扮演着重要的角色。它们可以帮助我们提高效率&#xff0c;简化复杂的任务。在这篇文章中&#xff0c;我将介绍三个非常有用的插件&#xff1a;Outschool&#xff0c;resume&#xff0c;和webhooks&#xff0c;并通过具体的例子来…...

【学习笔记】Unity基础(七)【uGUI基础、利用render Texture实现小地图功能】

目录 一 Canvas1.1 三种Render Space渲染空间 screen1.2 canvas scaler画布缩放器1.3sprite1.4 sprite packer1.5 unity目录1.6 RuleTile Tilemap1.7 sprite packer1.8 sorting layer 二 rect transform2.1 pivot 中轴 中心点2.2 anchor 锚点2.3 uGUI源代码 三 EventSystem3.1 …...

yolov5配置错误记录

这里是直接没有找到数据集&#xff0c;说明是路径错误。经过设置yaml后&#xff0c; # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..] path: ../autodl-tmp/datasets/neu # dataset root dir tr…...

全平台数据 (数据库) 管理工具 DataCap 1.10.0 发布

当前版本涉及几个主要更新。 DataCap 已发布 发布版本发布时间1.10.02023-05-30 General 修复服务启动默认连接 mongo修复了 sql 模板的 h2 db update_time 和 create_time改进 H2 元数据管理获取类型改进 mysql 元数据管理获取类型固定元数据管理数据页默认为 1重构数据渲染…...

使用Mybatis接口开发

文章目录 目录 前言 公司项目用到了mybatis开发接口,虽然很简单,但是mybatis不是特别熟悉,这里学习一下 一、Mybatis接口绑定的两种方式 1.接口绑定实现方式 就是在接口的方法上加上Select,updateInsertDelete等注解 select注解介绍: 简便,能快速去操作sql,它只需要在mapper…...

数据采集技术的实现原理有哪些?

数据采集技术是指通过各种手段和技术手段&#xff0c;从互联网、移动设备、传感器等各种数据源中获取数据&#xff0c;并将其存储、处理和分析&#xff0c;以便为业务决策和应用提供支持。本文将介绍数据采集技术的实现原理&#xff0c;包括数据采集的基本流程、数据采集技术的…...

2023年数学建模随机森林:基于多个决策树的集成学习方法

2023年9月数学建模国赛期间提供ABCDE题思路加Matlab代码,专栏链接(赛前一个月恢复源码199,欢迎大家订阅):http://t.csdn.cn/Um9Zd 目录 目录 1. 什么是随机森林? 2. 随机森林的优缺点 3. 随机森林的构建过程...

OpenAI发布最新研究让大模型数学推理直接达到SOTA

&#x1f989; AI新闻 &#x1f680; OpenAI发布最新研究&#xff1a;基于过程奖励的监督方法&#xff0c;让大模型数学推理直接达到SOTA 摘要&#xff1a;OpenAI最新研究基于GPT-4微调&#xff0c;采用过程监督和结果监督两种监督方法&#xff0c;奖励每个正确推理步骤的过程…...

快速检测 GlassFish 任意文件读取漏洞的 Python 脚本

部分数据来源:ChatGPT 引言 当下,互联网安全问题正愈发严重,黑客利用各种漏洞进行攻击的频率也在持续增加。在2015年10月,一位名为“路人甲”的安全研究员在乌云上公开了一个名为“应用服务器glassfish存在通用任意文件读取漏洞”的漏洞(编号:wooyun-2010-0144595),该…...

Docker镜像更新通知器DIUN

什么是 DIUN ? Docker Image Update Notifier 是一个用 Go 编写的 CLI 应用程序&#xff0c;可作为单个可执行文件和 Docker 映像交付&#xff0c;用于当 Docker 映像在 Docker registry中更新时接收通知。 和老苏之前介绍过的 watchtower 不同&#xff0c;DIUN 只是通知&…...

插件框架PF4J-从理论到实践

PF4J:Plugin Framework for Java 目录 是什么&#xff1f; 不是什么&#xff1f; 特点 组件 主要类 流程概述 spring-pf4j 思考 功能模块化 我对pf4j的封装和使用demo GitHub - chlInGithub/pf4jDemo: pf4j demo 是什么&#xff1f; 开源轻量级的插件框架。通过插件…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

【51单片机】4. 模块化编程与LCD1602Debug

1. 什么是模块化编程 传统编程会将所有函数放在main.c中&#xff0c;如果使用的模块多&#xff0c;一个文件内会有很多代码&#xff0c;不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里&#xff0c;在.h文件里提供外部可调用函数声明&#xff0c;其他.c文…...

从零手写Java版本的LSM Tree (一):LSM Tree 概述

&#x1f525; 推荐一个高质量的Java LSM Tree开源项目&#xff01; https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree&#xff0c;专为高并发写入场景设计。 核心亮点&#xff1a; ⚡ 极致性能&#xff1a;写入速度超…...