.NetCore學習筆記:四、AutoMapper對象映射

来源:https://www.cnblogs.com/letnet/archive/2020/01/17/12205352.html

什麼是AutoMapper?AutoMapper是一個簡單的小型庫,用於解決一個看似複雜的問題 - 擺脫將一個對象映射到另一個對象的代碼。這種類型的代碼是相當沉悶和無聊的寫,所以為什麼不發明一個工具來為我們做? 我們來看看在.netcore3.1中怎樣使用AutoMapper9.0。 Profile ...


什麼是AutoMapper?
AutoMapper是一個簡單的小型庫,用於解決一個看似複雜的問題 - 擺脫將一個對象映射到另一個對象的代碼。這種類型的代碼是相當沉悶和無聊的寫,所以為什麼不發明一個工具來為我們做?

我們來看看在.netcore3.1中怎樣使用AutoMapper9.0。

1 public class BasicProfile : Profile, IProfile
2 {
3     public BasicProfile()
4     {
5         CreateMap<TestDto, Test>();
6         CreateMap<Test, TestDto>();
7     }
8 }

Profile提供了一個命名的映射類,所有繼承自Profile類的子類都是一個映射集合。這裡我創建了一個BasicProfile繼承Profile類。
CreateMap創建映射規則。
IProfile創建影射類的約束,表示繼承自該介面的類為映射集合。

由於AutoMapper9.0中取消了自動創建影射規則的方法這裡我們需要自己寫一個:

 1 public static class ServiceCollectionExtensions
 2 {
 3     /// <summary>
 4     /// 自動創建映射
 5     /// </summary>
 6     /// <param name="services"></param>
 7     public static void AddAutoMapper(this IServiceCollection services)
 8     {
 9         var allProfile = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.dll").Select(Assembly.LoadFrom)
10             .SelectMany(y => y.DefinedTypes)
11             .Where(p => p.GetInterfaces().Contains(typeof(IProfile)))
12             .ToArray();
13         services.AddAutoMapper(allProfile);
14     }
15 }

添加到ConfigureServices:

1 public void ConfigureServices(IServiceCollection services)
2 {
3     //自動創建映射
4     services.AddAutoMapper();
5 }

這樣AutoMapper就配置完成,但為了方便調用,我們繼續寫幾個擴展:

 1 public static class AutoMapperApplicationBuilderExtensions
 2 {
 3     private static IServiceProvider _serviceProvider;
 4     public static void UseStateAutoMapper(this IApplicationBuilder applicationBuilder)
 5     {
 6         _serviceProvider = applicationBuilder.ApplicationServices;
 7     }
 8 
 9     public static TDestination Map<TDestination>(object source)
10     {
11         var mapper = _serviceProvider.GetRequiredService<IMapper>();
12         return mapper.Map<TDestination>(source);
13     }
14 
15     public static TDestination Map<TSource, TDestination>(TSource source)
16     {
17         var mapper = _serviceProvider.GetRequiredService<IMapper>();
18 
19         return mapper.Map<TSource, TDestination>(source);
20     }
21 
22     public static TDestination MapTo<TSource, TDestination>(this TSource source)
23     {
24         var mapper = _serviceProvider.GetRequiredService<IMapper>();
25         return mapper.Map<TSource, TDestination>(source);
26     }
27 
28     public static TDestination MapTo<TDestination>(this object source)
29     {
30         var mapper = _serviceProvider.GetRequiredService<IMapper>();
31         return mapper.Map<TDestination>(source);
32     }
33 
34     public static List<TDestination> MapToList<TDestination>(this IEnumerable source)
35     {
36         var mapper = _serviceProvider.GetRequiredService<IMapper>();
37         return mapper.Map<List<TDestination>>(source);
38     }
39 
40     public static List<TDestination> MapToList<TSource, TDestination>(this IEnumerable<TSource> source)
41     {
42         var mapper = _serviceProvider.GetRequiredService<IMapper>();
43         return mapper.Map<List<TDestination>>(source);
44     }
45 }

添加到Configure:

1 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
2 {
3     app.UseStateAutoMapper();
4 }

 使用:

1 public TestDto Get(string id)
2 {
3     var test = _testDomain.Get(id);
4     return test.MapTo<TestDto>();
5 }

 


您的分享是我們最大的動力!

更多相關文章
  • 微信公眾號: "Dotnet9" ,網站: "Dotnet9" ,問題或建議: "請網站留言" , 如果對您有所幫助: "歡迎贊賞" 。 C WPF可拖拽的TabControl 閱讀導航 1. 本文背景 2. 代碼實現 3. 本文參考 4. 源碼 1. 本文背景 本文介紹使用第三方開源庫 Draga ...
  • 系列介紹 簡介 【五分鐘的DotNet】是一個利用您的碎片化時間來學習和豐富.net知識的博文系列。它所包含了.net體系中可能會涉及到的方方面面,比如C 的小細節,AspnetCore,微服務中的.net知識等等。 5min+不是超過5分鐘的意思,"+"是知識的增加。so,它是讓您花費5分鐘以下的 ...
  • 之前接手老項目的時候有遇到一些的方法參數中使用了ref關鍵字加在傳參的參數前面的情況。對於新手,這裡介紹和講解一下ref的用法和實際效果。 CLR中預設所有方法的參數傳遞方式都是傳值,也就是說不管你傳遞的對象是值類型還是引用類型,在作為參數傳入到方法中時,傳遞的是原對象的副本。無論在方法中對該對象做 ...
  • 這幾天,對程式重構,主要針對angularjs的綁定: 第一個例子: 下麵是一段html程式: 不管是name或者是ng-model的屬性值,它都有一定規律"StartX"和"EndX" 後面的數字是連續的序號。 我們可以使用ASP.NET MVC的Razor的語法@for來簡化它們: @{ for ...
  • C#實現的Check Password,並根據輸錯密碼的次數分情況鎖定賬戶:如果輸入錯誤3次,登錄賬戶鎖定5分鐘並提示X點X分後重試登錄。如果5分鐘後再次輸入,累計輸入錯誤密碼累計達到5次。則賬戶會被永久鎖定,需聯繫系統管理員進行把資料庫中的輸入錯誤的次數(errorcount)進行清零解鎖才能登陸 ...
  • [TOC] MVC "MVC 維基百科,自由的百科全書" MVC 是軟體工程的一種軟體架構模式,它不是具體的技術,而是一種代碼分層的理念,主要體現了職責分離原則。 M Model 模型 V View 視圖 C Controller 控制器 對 MVC 的誤解及緣由 誤解:頁面視圖 = View ,E ...
  • 簡介 Orleans用起來的確很爽,更爽的是咱們有能監控它的工具。 " OrleansDashboard " 這個工具是一個可視化的Silo監控工具,Silo和Grain的活躍狀態一目瞭然,各個介面的響應速度也可以很清晰的統計到。 安裝 使用NuGet引用 然後修改 的配置,添加Dashboard: ...
  • Teigha中實體旋轉 代碼: using (var trans = database.TransactionManager.StartTransaction()) { Entity ent = trans.GetObject(entityId, OpenMode.ForWrite) asEntit ...
一周排行
  • 比如要拆分“呵呵呵90909086676喝喝999”,下麵當type=0返回的是中文字元串“呵呵呵,喝喝”,type=1返回的是數字字元串“90909086676,999”, private string GetStrings(string str,int type=0) { IList<strin ...
  • Swagger一個優秀的Api介面文檔生成工具。Swagger可以可以動態生成Api介面文檔,有效的降低前後端人員關於Api介面的溝通成本,促進項目高效開發。 1、使用NuGet安裝最新的包:Swashbuckle.AspNetCore。 2、編輯項目文件(NetCoreTemplate.Web.c ...
  • 2020 年 7 月 30 日, 由.NET基金會和微軟 將舉辦一個線上和為期一天的活動,包括 微軟 .NET 團隊的演講者以及社區的演講者。本次線上大會 專註.NET框架構建微服務,演講者分享構建和部署雲原生應用程式的最佳實踐、模式、提示和技巧。有關更多信息和隨時瞭解情況:https://focu... ...
  • #abp框架Excel導出——基於vue #1.技術棧 ##1.1 前端採用vue,官方提供 UI套件用的是iview ##1.2 後臺是abp——aspnetboilerplate 即abp v1,https://github.com/aspnetboilerplate/aspnetboilerp ...
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:碧茂大數據 PS:如有需要Python學習資料的小伙伴可以加下方的群去找免費管理員領取 input()輸入 Python提供了 input() 內置函數從標準輸入讀入一 ...
  • 從12年到20年,python以肉眼可見的趨勢超過了java,成為了當今It界人人皆知的編程語言。 python為什麼這麼火? 網路編程語言搜索指數 適合初學者 Python具有語法簡單、語句清晰的特點,這就讓初學者在學習階段可以把精力集中在編程對象和思維方法上。 大佬都在用 Google,YouT ...
  • 在社會上存在一種普遍的對培訓機構的學生一種歧視的現象,具體表現在,比如:當你去公司面試的時候,一旦你說了你是培訓機構出來的,那麼基本上你就涼了,那麼你瞞著不說,然後又通過了面試成功入職,但是以後一旦在公司被髮現有培訓經歷,可能會面臨被降薪,甚至被辭退,培訓機構出來的學生,在用人單位眼裡就是能力低下的 ...
  • from typing import List# 這道題看了大佬寫的代碼,經過自己的理解寫出來了。# 從最外圍的四周找有沒有為O的,如果有的話就進入深搜函數,然後深搜遍歷# 判斷上下左右的位置是否為Oclass Solution: def solve(self, board: List[List[s ...
  • import requests; import re; import os; # 1.請求網頁 header = { "user-agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, li ...
  • import requests; import re; import os; import parsel; 1.請求網頁 header = { "user-agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537. ...