使用 AutoMapper 自動在多個數據模型間進行轉換

訪問數據庫、IPC 通信、業務模型、視圖模型……對于同一個業務的同一種數據,經常會使用多種數據模型工作在不同的代碼模塊中。這時它們之間的互相轉換便是大量的重復代碼了。

使用 AutoMapper 便可以很方便地在不同的模型之間進行轉換而減少編寫太多的轉換代碼(如果這一處的代碼對性能不太敏感的話)。

關于 AutoMapper 的系列文章:

  • 使用 AutoMapper 自動在多個數據模型間進行轉換

  • 使用 AutoMapper 自動映射模型時,處理不同模型屬性缺失的問題

安裝 AutoMapper 庫

這是 AutoMapper 的官方 GitHub 倉庫:

  • AutoMapper/AutoMapper: A convention-based object-object mapper in .NET.

安裝 AutoMapper 的 NuGet 包即可在項目中使用 AutoMapper。

入門

以下是一個最簡單的控制臺演示程序的代碼。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Program.cs
var mapper = InitializeMapper();var dao = new Walterlv1Dao
{Id = "2ed3558ac938438fb2c1d2de71d7bb90",Name = "walterlv",Text = "blog.walterlv.com",
};
var vo = mapper.Map<Walterlv1Vo>(dao);
Console.WriteLine($"Name = {vo.Name}, Text = {vo.Text}");static IMapper InitializeMapper()
{var configuration = new MapperConfiguration(cfg =>{cfg.CreateMap<Walterlv1Dao, Walterlv1Vo>();});
#if DEBUGconfiguration.AssertConfigurationIsValid();
#endifvar mapper = configuration.CreateMapper();return mapper;
}

在這段代碼中:

  1. 我們定義了一個方法 InitializeMapper,在里面初始化 IMapper 的新實例。

  • 初始化?MapperConfiguration,定義類型的映射關系

  • 在?DEBUG?下驗證?MapperConfiguration?的映射是否正確

  • 創建一個?IMapper?的映射器,用于后續映射使用

我們初始化了一個?Walterlv1Dao?類的實例

我們調用?mapper.Map?將其映射到?Walterlv1Vo?類型

這兩個類型的定義如下(雖然無關緊要)。

1
2
3
4
5
6
7
8
9
10
11
12
public class Walterlv1Dao
{public string? Id { get; set; }public string? Name { get; set; }public string? Text { get; set; }
}
public class Walterlv1Vo
{public string? Id { get; set; }public string? Name { get; set; }public string? Text { get; set; }
}

如果你的應用程序中會使用到依賴注入,那么只需要把拿到的 IMapper 加入即可。

如果希望兩個類型之間能夠雙向映射,那么在初始化 IMapper 的時候也應該再額外調用一下 ReverseMap 方法,否則就會拋出異常 AutoMapper.AutoMapperMappingException:“Missing type map configuration or unsupported mapping.”。

1
cfg.CreateMap<Walterlv1Dao, Walterlv1Vo>().ReverseMap();

復雜類型和集合

現在,我們讓模型稍復雜一些:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Walterlv1Dao
{public string? Id { get; set; }public string? Name { get; set; }public FriendDao? Friend { get; set; }
}
public class FriendDao
{public string? Id { get; set; }public string? Name { get; set; }
}
public class Walterlv1Vo
{public string? Id { get; set; }public string? Name { get; set; }public FriendVo? Friend { get; set; }
}
public class FriendVo
{public string? Id { get; set; }public string? Name { get; set; }
}

AutoMapper 能處理這樣的屬性嵌套情況,只需要設置嵌套類型也能映射即可:

1
2
cfg.CreateMap<Walterlv1Dao, Walterlv1Vo>().ReverseMap();
cfg.CreateMap<FriendDao, FriendVo>().ReverseMap();

如果兩個模型中子模型的類型是一樣的,那么只會進行簡單的賦值,而不會創建新的對象。

例如上面例子里,如果 FriendDao 和 FriendVo 合并成 Friend 類型,兩個類型都使用這個合并的類型,那么映射之后,Friend 將是同一個對象。

除了復雜類型,列表也是可以的:

1
2
3
4
5
6
7
8
9
10
11
12
public class Walterlv1Dao
{public string? Id { get; set; }public string? Name { get; set; }public List<FriendDao>? Friend { get; set; }
}
public class Walterlv1Vo
{public string? Id { get; set; }public string? Name { get; set; }public List<FriendVo>? Friend { get; set; }
}

參考資料

  • AutoMapper/AutoMapper: A convention-based object-object mapper in .NET.

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

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

相關文章

集合類型內建方法

一、集合類型方法方法名稱 操作 s.issubset(t)如果s是t的子集&#xff0c;則返回True&#xff0c;否則返回Falses.issuperset(t)如果s是t的超集&#xff0c;則返回True&#xff0c;否則返回Falses.union(t)返回一個新集合&#xff0c;該集合是s和t的并集s.intersection(t)返回…

Maven基礎:Maven環境搭建及基本使用(1)

1. Maven環境搭建 1.1 Maven簡介 1.2 Maven下載及環境設置 Maven下載地址&#xff1a;http://maven.apache.org/download.cgi 當前下載版本&#xff1a;apache-maven-3.5.0-bin.zip&#xff0c;解壓之后路徑 D:\Program Files\apache-maven-3.5.0 Maven環境變量設置&#xff1a…

mysql主外鍵引用關系,關于mysql:數據主/外鍵關系

我想對于那些已經開發了許多數據庫模式的人來說&#xff0c;這將是一個簡單的答案&#xff0c;但是我最近發現自己承擔了優化(或嘗試優化)數據庫模式的任務&#xff0c;并且一直在閱讀"高性能MySQL"&#xff0c;并且剩下一個關于在模式中使用或"過度使用"外…

解讀微軟開源MMLSpark:統一的大規模機器學習生態系統

AI前線導讀&#xff1a;目前&#xff0c;有很多深度學習框架支持與Spark集成&#xff0c;如Tensorflow on Spark等。然而&#xff0c;微軟開源的MMLSpark不僅集成了機器學習框架&#xff08;CNTK深度學習計算框架、LightGBM機器學習框架&#xff09;&#xff0c;還可以將這些計…

floyd判環算法(龜兔賽跑算法)

floyd判環算法&#xff08;龜兔賽跑算法&#xff09; 注意&#xff0c;這個算法是用來判斷一條鏈一條環的圖&#xff0c;環的長度或者環與鏈的交界處的&#xff0c;所以此floyd非彼floyd&#xff08;雖然都是一個人想出來的&#xff09;。 &#xff08;圖不是我的&#xff09; …

一個redis的連接庫的實現

2019獨角獸企業重金招聘Python工程師標準>>> import socketdef format_message( args):"""Create redis message:param args:Message data"""l u"*%d" % len(args)lines [l.encode(utf-8)]for arg in args:if not isinst…

matlab 邊緣檢測不閉合,Matlab多種圖像邊緣檢測方法

1、用Prewitt算子檢測圖像的邊緣I imread(bacteria.BMP);BW1 edge(I,prewitt,0.04); % 0.04為梯度閾值figure(1);imshow(I);figure(2);imshow(BW1);2、用不同σ值的LoG算子檢測圖像的邊緣I imread(bacteria.BMP);BW1 edge(I,log,0.003); % σ2imshow(BW1);titl…

實現CSS在線美化(格式化)、壓縮、加密、解密、混淆工具-toolfk程序員工具網

本文要推薦的[ToolFk]是一款程序員經常使用的線上免費測試工具箱&#xff0c;ToolFk 特色是專注于程序員日常的開發工具&#xff0c;不用安裝任何軟件&#xff0c;只要把內容貼上按一個執行按鈕,就能獲取到想要的內容結果。ToolFk還支持 BarCode條形碼在線生成、 QueryList采集…

只是他給的實在太多了!

工作幾年后&#xff0c;總是會問自己一個問題&#xff0c;工作的意義是什么&#xff1f;這個如果要在網絡上尋找答案&#xff0c;那一定是多如牛毛&#xff0c;每一個人都有一套自己的看法。在一開始出入社會工作之時&#xff0c;我并沒有意識到這個問題&#xff0c;更沒有思考…

[ci]jenkins server啟動,通過jnlp的方式啟動slave(容器模式)

jenkins server啟動,通過jnlp的方式啟動slave. java -jar jenkins.jar 配置jnlp端口--全局安全 配置云 配置項目 執行成功 轉載于:https://www.cnblogs.com/iiiiher/p/7978831.html

Oracle 中UNDO與REDO的差別具體解釋

一 為了更清楚的看出2者差別&#xff0c;請看下表&#xff1a; UNDO REDO Record ofHow to undo a changeHow to reproduce a changeUsed forRollback, Read-ConsistencyRolling forward DB ChangesStored …

php實現文件留言,PHP文件操作及實例:留言板

一、文件操作函數1.創建文件&#xff1a;touch(./xxx.php);bool touch ( string $filename [, int $time time() [, int $atime ]] )2.復制文件&#xff1a;copy(./xxx.php,./yyy.php);3.移動或重命名&#xff1a;rename(./xxx.php,./yyy.php);4.刪除文件&#xff1a;unlink(.…

WPF-11 路由事件之一

什么是路由事件&#xff1f;我們從兩個維度來理解路由事件&#xff1a;功能的角度來看&#xff0c;路由事件是一種事件類型&#xff0c;不僅僅可以在事件源上處理事件響應&#xff0c;還可以在元素樹的多個偵聽器上處理事件響應(事件偵聽器是附加和調用事件處理程序的元素。事件…

個人總結的一個中高級Java開發工程師或架構師需要掌握的一些技能...

近三年&#xff0c;其實都是在做一個項目&#xff0c;項目是一個大型的多節點部署的項目&#xff0c;做了好幾個版本&#xff0c;中間用到了很多技術和框架&#xff0c; 也用了一些管理工具和敏捷實踐。我這里不是來說項目的&#xff0c;因為最近看了一些招聘信息&#xff0c;結…

Android 進程常駐(5)----開機廣播的簡單守護以及總結

這是一個輕量級的庫&#xff0c;配置幾行代碼。就能夠實如今android上實現進程常駐&#xff0c;也就是在系統強殺下&#xff0c;以及360獲取root權限下。clean master獲取root權限下都無法殺死進程 支持系統2.3到6.0 支持大部分設備&#xff0c;包含三星。華為。oppo&#xff0…

[k8s]metricbeat的kubernetes模塊kube-metric模塊

正確姿勢啟動metricbeat metricbeat.modules: - module: systemmetricsets:- cpu- filesystem- memory- network- processenabled: trueperiod: 10sprocesses: [.*]cpu_ticks: falseoutput.elasticsearch:hosts: ["http://192.168.x.x:9200"]setup.template.name: &q…

如何為 Task 添加超時功能

前言假設有如下代碼&#xff0c;功能是首先從緩存獲取數據&#xff0c;如果沒有命中緩存&#xff0c;則直接從數據庫獲取&#xff1a;var data await GetFromCache(); if (data is null) {data await GetFromDB(); }對于獲取緩存數據&#xff0c;我們需要限制一下GetFromCach…

php 隨機指定位數,php生成一個可選位數的隨機碼

echo coding(6);function coding($num){$str_arr array(‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘,‘g‘,‘h‘,‘i‘,‘j‘,‘k‘,‘l‘,‘m‘,‘n‘,‘o‘,‘p‘,‘q‘,‘r‘,‘s‘,‘t‘,‘u‘,‘v‘,‘w‘,‘x‘,‘y‘,‘z‘,‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘G‘,‘H‘…

Animate與transform的使用

Animate是用css給前端加載動畫的效果&#xff1a; 網址&#xff1a;https://daneden.github.io/animate.css/ <!DOCTYPE html> <html lang"en"> <head><link rel"stylesheet" href"static/css/Animate.css"><meta ch…

angular中的cookies與cookieStore區別

設置cookie用put()方法: $cookies.put(key, value[, options]); $cookieStore.put(key, value); 例如設置一個cookie&#xff0c;名為“userName”&#xff0c;值為“yangmin”&#xff1a; //使用$cookies設置cookie $cookies.put(userName, yangmin); //使用$cookieStore設置…