AutoMapper入門

在 ASP.NET Core 開發中,我們經常需要在不同層之間傳遞數據:比如從數據庫模型(Entity)轉換到 DTO,再從 DTO 轉換為前端視圖模型。這些轉換代碼大量重復、冗長、容易出錯。為了解決這個問題,AutoMapper 誕生了。

本文主要介紹在WebApi(.net?8)環境中使用AutoMapper 14.0.0

官方文檔地址:AutoMapper — AutoMapper documentation

一、什么是 AutoMapper?

AutoMapper 是一個 .NET 類庫,它能自動在兩個類型之間做映射,尤其是當這些類型擁有相似屬性時。它減少了手動編寫 obj.Prop = dto.Prop 的重復性勞動。

public class Student
{public string Name { get; set; }public int Age { get; set; }public string Address{ get; set; }public string Nickname{ get; set; }
}public class Dto_Student
{public string Name { get; set; }public int Age { get; set; }
}

可以直接通過 AutoMapper 在這兩者之間做轉換,而無需顯式賦值。

二、基本用法:從零開始配置

1.安裝 NuGet 包

dotnet add package AutoMapper --version 14.0.0

13.0開始無需引入AutoMapper.Extensions.Microsoft.DependencyInjection?

2.配置映射關系

創建一個映射配置 Profile 類:

public class StudentProfile : Profile
{public StudentProfile(){CreateMap<Student, Dto_Student>();CreateMap<Dto_Student, Student>();}
}

3.在 Program.cs中注冊

using AutoMapper;namespace AutoMapperProfileConfig
{/// <summary>/// 標記程序集啞類/// </summary>public class AutoMapperProfileConfigMarker : Profile{public AutoMapperProfileConfigMarker(){}}
}
builder.Services.AddAutoMapper(typeof(AutoMapperProfileConfigMarker).Assembly);

?

建議專門建立一個類庫,同時為每個表的映射創建一個映射類,然后創建一個專門標記程序集而不做其他事的一個啞類.

這樣可以自動掃描該類庫里面的所有的Profile類(還有幾種其他方法,可自行查看)

4.依賴注入使用映射服務

[ApiController]
[Route("api/[controller]")]
public class StudentController : ControllerBase
{private readonly YourDbContext _context;private readonly IMapper _mapper;public StudentController(YourDbContext context, IMapper mapper){_context = context;_mapper = mapper;}// GET: api/Student[HttpGet]public async Task<ActionResult<IEnumerable<Dto_Student>>> GetStudents(){// 從數據庫獲取 Student 實體列表var students = await _context.Students.ToListAsync();// 使用 AutoMapper 將實體列表映射為 DTO 列表var studentDtos = _mapper.Map<List<Dto_Student>>(students);// 返回給前端return Ok(studentDtos);}
}

5.命名約定?

默認情況映射的屬性名必須完全一致,但你可以配置實現特殊的映射關系.

AutoMapper 中命名約定的優先級關系如下:

? ? ?優先級從高到低:

  1. CreateMap().ForMember() 明確指定字段映射

  2. Profile 中設置的命名約定

  3. 全局設置(MapperConfiguration 中配置)

  4. 默認行為(ExactMatchNamingConvention)

public class Source
{public string user_id { get; set; }
}public class Destination
{public string UserId { get; set; }
}

?

情況 1:使用 .ForMember() 明確映射

CreateMap<Source, Destination>().ForMember(dest => dest.UserId, opt => opt.MapFrom(src => src.user_id));

優先級最高,無論有沒有配置命名約定,它都生效

情況 2:Profile 中設置命名約定

public class MyProfile : Profile
{public MyProfile(){SourceMemberNamingConvention = LowerUnderscoreNamingConvention.Instance;DestinationMemberNamingConvention = PascalCaseNamingConvention.Instance;CreateMap<Source, Destination>();}
}

會生效,但僅限于此 Profile 中的 CreateMap 映射。?

情況 3:全局配置命名約定

services.AddAutoMapper(cfg =>
{cfg.SourceMemberNamingConvention = LowerUnderscoreNamingConvention.Instance;cfg.DestinationMemberNamingConvention = PascalCaseNamingConvention.Instance;
}, typeof(SomeMarker));

會自動應用到所有未手動指定命名規則的 Profile 中的映射

情況 4:都不配置時,默認使用 ExactMatch

即只匹配名字完全一致(區分大小寫)的屬性名

設置方式作用范圍優先級備注
.ForMember()某個字段映射🥇 最高覆蓋一切
Profile 中命名約定當前 Profile🥈 中高優于全局配置
cfg.SourceMemberNamingConvention所有 Profile🥉 中等默認使用
不設置使用 ExactMatch最低僅匹配完全相同

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91068.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91068.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91068.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PyTorch武俠演義 第一卷:初入江湖 第1章:武林新秀遇Tensor - 張量基礎

第一卷&#xff1a;初入江湖 第1章&#xff1a;武林新秀遇Tensor - 張量基礎晨起碼農村 雞鳴三聲&#xff0c;林小碼已經收拾好了行囊。他最后看了眼床頭那本翻舊的《Python入門心法》&#xff0c;輕輕撫平卷起的書角。 "小碼&#xff0c;路上小心。"父親將一把青銅匕…

Python進階(4):類與面向對象程序設計

面向對象OOPOOP:Object Oriented Programming,面向對象編程,面向對象中的對象(Obiect)&#xff0c;通常是指客觀世界中存在的對象&#xff0c;這個對象具有唯一性&#xff0c;對象之間各不相同&#xff0c;各有各的特點&#xff0c;每個對象都有自己的運動規律和內部狀態;對象與…

如何在 Shopify 中創建退貨標簽

退貨是電商運營中不可避免的一環&#xff0c;而一個順暢、透明的退貨流程&#xff0c;不僅能減少客戶投訴&#xff0c;也有助于提升顧客對品牌的信任與忠誠度。Shopify 雖然沒有內建退貨標簽自動生成功能&#xff0c;但通過合理設置與外部工具整合&#xff0c;你完全可以打造一…

I2C設備寄存器讀取調試方法

1、查看I2C掛載設備 2、讀取i2C設備所有寄存器 3、讀取i2c設備的某個寄存器 4、向i2C設備某個寄存器寫入一個值1、查看

K8S的Helm包管理器

一、背景 官網: https://helm.sh/ 我們針對K8S環境中&#xff0c;部署對應的應用&#xff0c;無外乎就是編寫一堆yaml資源清單文件. 資源清單、依賴性少的時候&#xff0c;可以直接手動維護。但是&#xff0c;隨著資源清單越來越復雜&#xff0c;越來越多&#xff0c;不同的環…

多模態數據處理新趨勢:阿里云ODPS技術棧深度解析與未來展望

多模態數據處理新趨勢&#xff1a;阿里云ODPS技術棧深度解析與未來展望 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 總有一行代碼&#xff0c;能點亮萬千星辰。 &#x1f50d; 在技術的宇宙中&#xff0c;我愿做永不停歇的探索者。 ? 用代碼丈…

AI數據分析儀設計原理圖:RapidIO信號接入 平板AI數據分析儀

AI數據分析儀設計原理圖&#xff1a;RapidIO信號接入 平板AI數據分析儀 1 、概述 本儀器是一款面向工業控制、新能源、震動測量等業務開發的平板AI數據分析儀。基于 Jetson Orin Nano&#xff08;AI邊緣計算&#xff09;、實現RapidIO接口數據接入&#xff0c;進行AI分析。Rap…

人工智能正逐步商品化,而“理解力”才是開發者的真正超能力

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

玩轉ClaudeCode:ClaudeCode安裝教程(Windows+Linux+MacOS)

Windows 環境安裝 Claude Code 一、安裝 WSL 環境 1. 確認 Windows 功能已開啟 打開 “控制面板 → 程序 → 啟用或關閉 Windows 功能” 勾選 “適用于 Linux 的 Windows 子系統” 和 “虛擬機平臺” 點“確定”后重啟電腦。 開機后&#xff0c;管理員模式打開 Terminal…

PyTorch多層感知機(MLP)模型構建與MNIST分類訓練

沖沖沖&#x1f60a; here&#x1f60a; 文章目錄PyTorch多層感知機模型構建與MNIST分類訓練筆記&#x1f3af; 1. 任務概述?? 2. 環境設置2.1 導入必要庫2.2 GPU配置&#x1f9e0; 3. 模型構建3.1 模型定義關鍵點3.2 損失函數選擇3.3 模型初始化與設備選擇&#x1f527; 4. …

android tabLayout 切換fragment fragment生命周期

1、TabLayout 與 Fragment 結合使用的常見方式 通常會使用 FragmentPagerAdapter 或 FragmentStatePagerAdapter 與 ViewPager 配合,再將 TabLayout 與 ViewPager 關聯,實現通過 TabLayout 切換 Fragment。 以下是布局文件示例 activity_main.xml: <LinearLayout xmln…

馬蹄集 BD202401補給

可怕的戰爭發生了&#xff0c;小度作為后勤保障工作人員&#xff0c;也要為了保衛國家而努力。現在有 N(1≤N≤)個堡壘需要補給&#xff0c;然而總的預算 B(1≤B≤)是有限的。現在已知第 i 個堡壘需要價值 P(i) 的補給&#xff0c;并且需要 S(i) 的運費。 鑒于小度與供應商之間…

《Llava:Visual Instruction Tuning》論文精讀筆記

論文鏈接&#xff1a;arxiv.org/pdf/2304.08485 參考視頻&#xff1a;LLAVA講解_嗶哩嗶哩_bilibili [論文速覽]LLaVA: Visual Instruction Tuning[2304.08485]_嗶哩嗶哩_bilibili 標題&#xff1a;Visual Instruction Tuning 視覺指令微調 背景引言 大模型的Instruction…

【DataWhale】快樂學習大模型 | 202507,Task01筆記

引言 我從2016年開始接觸matlab看別人做語音識別&#xff0c;再接觸tensorflow的神經網絡&#xff0c;2017年接觸語音合成&#xff0c;2020年做落地的醫院手寫數字識別。到2020年接觸pytorch做了計算機視覺圖像分類&#xff0c;到2021年做了目標檢測&#xff0c;2022年做了文本…

機器學習中的樸素貝葉斯(Naive Bayes)模型

1. 用實例來理解樸素貝葉斯 下面用具體的數據來演示垃圾郵件 vs 正常郵件的概率計算假設我們有一個小型郵件數據集郵件內容類別&#xff08;垃圾/正常&#xff09;“免費 贏取 大獎”垃圾“免費 參加會議”正常“中獎 點擊 鏈接”垃圾“明天 開會”正常“贏取 免費 禮品”垃圾 …

document.documentElement詳解

核心概念定義 它始終指向當前文檔的根元素&#xff0c;在 HTML 文檔中對應 <html> 標簽。與 document.body&#xff08;對應 <body>&#xff09;和 document.head&#xff08;對應 <head>&#xff09;形成層級關系。與 document.body 的區別 <html> &l…

c#進階之數據結構(動態數組篇)----Queue

1、簡介這個是c#封裝的隊列類型&#xff0c;同棧相反&#xff0c;這個是先進先出&#xff0c;一般用于事件注冊&#xff0c;或者數據的按順序處理&#xff0c;理解為需要排隊處理的可以用隊列來處理。注意&#xff0c;隊列一定是有順序的&#xff0c;先進確實是會先出&#xff…

使用 keytool 在服務器上導入證書操作指南(SSL 證書驗證錯誤處理)

使用 keytool 在服務器上導入證書操作指南(SSL 證書驗證錯誤處理) 一、概述 本文檔用于指導如何在運行 Java 應用程序的服務器上,通過keytool工具將證書導入 Java 信任庫,解決因證書未被信任導致的 SSL/TLS 通信問題(如PKIX path building failed錯誤)。 二、操作步驟…

VUE export import

目錄 命名導出 導出變量 導出函數 總結 默認導出 導出變量 導出函數 總結 因為總是搞不懂export和Import什么時候需要加{}&#xff0c;什么時候不用&#xff0c;所以自己測試了一下&#xff0c;以下是總結。 需不需要加{}取決于命名導出還是默認導出&#xff0c;命名導…

端側寵物識別+拍攝控制智能化:解決設備識別頻次識別率雙低問題

隨著寵物成為家庭重要成員&#xff0c;寵物影像創作需求激增&#xff0c;傳統相機系統 “人臉優先” 的調度邏輯已難以應對寵物拍攝的復雜場景。毛發邊緣模糊、動態姿態多變、光照反差劇烈等問題&#xff0c;推動著智能拍攝技術向 “寵物優先” 范式轉型。本文基于端側 AI 部署…