.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 ...
一周排行
  • 1. 泛型Generic 1.1 引入泛型:延遲聲明 泛型方法聲明時,並未寫死類型,在調用的時候再指定類型。 延遲聲明:推遲一切可以推遲的。 1.2 如何聲明和使用泛型 泛型方法:方法名稱後面加上尖括弧,裡面是類型參數 類型參數實際上就是一個類型T聲明,方法就可以用這個類型T了。 如下所示: pub ...
  • 本筆記摘抄自:https://www.cnblogs.com/PatrickLiu/p/7903617.html,記錄一下學習過程以備後續查用。 一、引言 今天我們要講行為型設計模式的第三個模式--迭代器模式,先從名字上來看。迭代是遍歷的意思,迭代器可以理解為是遍歷某某的工具,遍歷什麼呢?在軟 件設 ...
  • 本筆記摘抄自:https://www.cnblogs.com/PatrickLiu/p/7928521.html,記錄一下學習過程以備後續查用。 一、引言 今天我們要講行為型設計模式的第四個模式--觀察者模式,先從名字上來看。觀察者模式可以理解為既然有“觀察者”,那肯定就有“被觀察者”了。“觀察者” ...
  • 先看核心代碼: public List<DataEntity> SearchShopSalesReport(DateTimeOffset? dateFrom, DateTimeOffset? dateTo,string groupBy) { var query = data.DataEntity / ...
  • 首先新建一個項目,名稱叫Caliburn.Micro.ActionConvertions 然後刪掉MainWindow.xaml 然後去app.xaml刪掉StartupUri這行代碼 其次,安裝Caliburn.Micro,Caliburn.Micro.Core,這兩個Nuget包,如下圖 然後新 ...
  • 一文帶你瞭解 C DLR 的世界 在很久之前,我寫了一片文章 "dynamic結合匿名類型 匿名對象傳參" ,裡面我以為DLR內部是用反射實現的。因為那時候是心中想當然的認為只有反射能夠在運行時解析對象的成員信息並調用成員方法。後來也是因為其他的事一直都沒有回過頭來把這一節知識給補上,正所謂亡羊補牢 ...
  • ​ 在C#8.0中,針對介面引入了一項新特性,就是可以指定預設實現,方便對已有實現進行擴展,也對面向Android和Swift的Api進行互操作提供了可能性。下麵我們來看看該特性的具體規則與實現。 一、主要應用場景: 在不破壞影響已有實現的情況下,可以添加新成員。這解決了在第三方已經大量使用了的介面 ...
  • 前言 通常在應用程式開發到正式上線,在這個過程中我們會分為多個階段,通常會有 開發、測試、以及正式環境等。每個環境的參數配置我們會使用不同的參數,因此呢,在ASP.NET Core中就提供了相關的環境API,方便我們更好的去做這些事情。 環境 ASP.NET Core使用ASPNETCORE_ENV ...
  • 擱置了幾天,工作忙的一塌糊塗,今天終於抽空來繼續看看MVC的知識。先來看看MVC的路由是如何處理的。以下為替代的路由: app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{ ...
  • 多用www.bing.com國際版解決代碼報錯 代碼運行的時候,報異常,國內的搜索引擎一搜, 浮誇的廣告太多,解決方案准確性不足, 盜版又很嚴重(導致一錯皆錯),方案未及時更新等詬病。 www.bing.com國際版可以關聯到: (1). 外國官網,可以獲得官方的解決方案。 (2). stackov ...
x