.Net Core中更高階的AutoMapper示例
AutoMapper是基於約定的,物件導向的對映器。 物件導向的對映器是將輸入物件轉換為不同型別的輸出物件的對映器。 AutoMapper也可以用於對映相似或不相似的物件(即,具有相同或不同的屬性的物件)。
在上一篇文章中,我們檢查了AutoMapper的基本功能。 在本文中,我們將探討AutoMapper的一些高階功能。
在Visual Studio中建立一個ASP.Net Core專案
首先,讓我們在Visual Studio中建立一個新的ASP.Net Core專案。 請注意,您可以建立任何專案(例如,MVC或什至是控制檯應用程式)來使用AutoMapper。 如果您的系統中安裝了Visual Studio 2019,請按照下面概述的步驟建立一個新的ASP.Net Core專案。
- 啟動Visual Studio IDE。
- 點選“建立新專案”。
- 在“建立新專案”視窗中,從顯示的模板列表中選擇“ ASP.Net Core Web應用程式”。
- 點選下一步。
- 在接下來顯示的“配置新專案”視窗中,指定新專案的名稱和位置。
- 單擊建立。
- 在接下來顯示的“建立新的ASP.Net Core Web應用程式”視窗中,從頂部的下拉選單中選擇.Net Core作為執行時,並選擇ASP.Net Core 2.2(或更高版本)。
- 選擇“ Web應用程式”作為專案模板,以建立一個新的ASP.Net Core Web應用程式。
- 確保未選中“啟用Docker支援”和“配置HTTPS”核取方塊,因為我們此處將不再使用這些功能。
- 確保將身份驗證設定為“無身份驗證”,因為我們也不會使用身份驗證。
- 單擊建立。
現在,您應該已經準備好在Visual Studio中執行一個新的ASP.Net Core專案。 我們將在本文的後續部分中使用該專案,以說明一些使用AutoMapper的高階操作。
安裝AutoMapper
要開始使用AutoMapper,應在專案中安裝必要的軟體包。 為此,您可以在NuGet軟體包管理器控制檯視窗中使用以下命令:
Install-Package AutoMapper
Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection
假設安裝成功,您都可以在專案中使用AutoMapper。
配置自動對映器
成功安裝AutoMapper之後,可以通過在IServiceCollection例項上呼叫AddAutoMapper方法來對其進行配置。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion
(CompatibilityVersion.Version_2_2);
services.AddAutoMapper();
}
使用配置檔案在AutoMapper中指定對映資訊
您可以使用配置檔案來組織對映集合。 若要建立配置檔案,您需要建立一個擴充套件AutoMapper庫的Profile類的類。 然後,您可以將必要的對映配置資訊新增到剛建立的類的建構函式中。 CreateMap方法用於建立兩種型別之間的對映。
下列類顯示如何通過擴充套件Profile類並指定對映資訊來建立名為AuthorProfile的類。
public class AuthorProfile : Profile
{
public AuthorProfile()
{
CreateMap<AuthorModel, AuthorDTO>();
}
}
在AutoMapper中使用ReverseMap()方法
請注意,上面的示例是單向對映。 同樣,假設您已使用CreateMap方法定義了單向對映,如下面的程式碼片段所示。
AutoMapper.Mapper.CreateMap<Author, AuthorModel>();
現在,您可以將Author類的例項對映到AuthorModel,如下所示。
var authorModel = AutoMapper.Mapper.Map<AuthorModel>(author);
現在,假設您想將AuthorModel例項對映回Author例項。 您可以嘗試使用以下程式碼。
var author = AutoMapper.Mapper.Map<Author>(authorModel);
但是,請注意,這將引發執行時異常。 發生異常是因為AutoMapper執行時缺少執行此對映所需的知識。 實現此反向對映的一種方法是從頭開始重新建立對映。 一種更簡單更好的方法是通過使用CreateMap方法之外的ReverseMap方法,如下面的程式碼片段所示。
AutoMapper.Mapper.CreateMap<Author, AuthorModel>().ReverseMap();
在AutoMapper中使用ForMember()和MapFrom()方法
下一個示例將使用上一篇有關AutoMapper的文章中的AuthorModel和AuthorDTO類。 您可以在此處參考該文章 。
以下程式碼段說明了如何對映AuthorModel和AuthorDTO類的物件。
var author = new AuthorModel();
author.Id = 1;
author.FirstName = "Joydip";
author.LastName = "Kanjilal";
author.Address = "Hyderabad";
var authorDTO = _mapper.Map<AuthorDTO>(author);
現在,假設在AuthorModel類中名為Address的屬性已更改為Address1。
public class AuthorModel
{
public int Id
{
get; set;
}
public string FirstName
{
get; set;
}
public string LastName
{
get; set;
}
public string Address1
{
get; set;
}
}
然後,您可以在AuthorProfile類中更新對映資訊,如下所示。
public class AuthorProfile : Profile
{
public AuthorProfile()
{
CreateMap<AuthorModel, AuthorDTO>().ForMember
(destination => destination.Address,
map => map.MapFrom(source => source.Address1));
}
}
在AutoMapper中使用NullSubstitute
假設AuthorModel中的Address欄位為null,並且您希望使用“ No data”之類的東西來代替null值。 這是NullSubstitution起作用的地方。 以下程式碼段說明了如何使用“無資料”替換空值。
AutoMapper.Mapper.CreateMap<AuthorModel, AuthorDTO>()
.ForMember(destination => destination.Address, opt => opt.NullSubstitute("No data"));
在AutoMapper中對映之前和之後使用
考慮以下兩個類。
public class OrderModel
{
public int Id { get; set; }
public string ItemCode { get; set; }
public int NumberOfItems { get; set; }
}
public class OrderDTO
{
public int Id { get; set; }
public string ItemCode { get; set; }
public int NumberOfItems { get; set; }
}
您可以利用BeforeMap()方法執行一些計算或初始化源或目標例項中的資料成員。 以下程式碼段說明了如何實現此目的。
Mapper.Initialize(cfg => {
cfg.CreateMap()
.BeforeMap((src, dest) => src.NumberOfItems = 0)
});
完成對映後,可以使用AfterMap()方法對目標物件執行操作。 這是在目標例項上使用AfterMap()方法的方法。
public OrderDTO MapAuthor(IMapper mapper, OrderDTO orderDTO)
{
return mapper.Map<OrderModel, OrderDTO>(orderDTO, opt =>
{
opt.AfterMap((src, dest) =>
{
dest.NumberOfItems =
_orderService.GetTotalItems(src);
});
});
}
在AutoMapper中使用巢狀對映
AutoMapper也可以用於對映巢狀物件。 請考慮以下域類。
public class Order
{
public string OrderNumber { get; set; }
public IEnumerable<OrderItem> OrderItems { get; set; }
}
public class OrderItem
{
public string ItemName { get; set; }
public decimal ItemPrice { get; set; }
public int ItemQuantity { get; set; }
}
考慮以下代表資料傳輸物件的類。
public class OrderDto
{
public string OrderNumber { get; set; }
public IEnumerable<OrderItemDto> OrderItems { get; set; }
}
public class OrderItemDto
{
public string ItemName { get; set; }
public decimal ItemPrice { get; set; }
public int ItemQuantity { get; set; }
}
您可以使用以下程式碼建立對映。
var orders = _repository.GetOrders();
Mapper.CreateMap<Order, OrderDto>();
Mapper.CreateMap<OrderItem, OrderItemDto>();
var model = Mapper.Map<IEnumerable<Order>, IEnumerable<OrderDto>>(orders);
AutoMapper使您能夠以最少的配置對映物件。 您甚至可以使用自定義解析器來對映具有不同資料結構的物件。 自定義解析器可以生成與目標物件具有相同結構的交換物件,以便AutoMapper執行時可以在執行時對映型別。
From: https://www.infoworld.com/article/3406800/more-advanced-automapper-examples-in-net-core.html
相關文章
- .Net core 中 AutoMapper的應用APP
- .NET Core 中AutoMapper的配置及使用APP
- .net Core 使用AutoMapperAPP
- .net core3.1 AutoMapperAPP
- .net core中使用AutomapperAPP
- ASP.NET Core 中的物件對映之 AutoMapperASP.NET物件APP
- .NET Core Dto對映(AutoMapper)APP
- .NET CORE AUTOMAPPER 對映一個類的子類APP
- .Net Core AutoMapper自定義擴充套件方法的使用APP套件
- 在ASP.NET Core MVC 2.2 中使用AutoMapperASP.NETMVCAPP
- .NET CORE 中使用AutoMapper進行物件對映APP物件
- asp.net core 3.1.x 中使用AutoMapperASP.NETAPP
- 【asp.net core 系列】4. 更高更強的路由ASP.NET路由
- 構建可讀性更高的 ASP.NET Core 路由ASP.NET路由
- .net framework autoMapper使用FrameworkAPP
- Asp.Net Core中Typed HttpClient高階用法ASP.NETHTTPclient
- 【asp.net core 系列】14 .net core 中的IOCASP.NET
- .NET Core中的Worker Service
- 在 ASP.NET Core 專案中使用 AutoMapper 進行實體對映ASP.NETAPP
- 在.Net Core當中的WebApi 的模型繫結各種示例用法 以及使用場景WebAPI模型
- ASP.NET Core 高階(一)【.NET 的開放 Web 介面 (OWIN)】ASP.NETWeb
- csredis-in-asp.net core理論實戰-使用示例RedisASP.NET
- .Net Core 中GC的工作原理GC
- .Net Core 中的選項Options
- 在.net core中使用配置檔案的幾個示例和方法
- .NET Core(.NET6)中gRPC使用RPC
- 《Asp.Net Core3 + Vue3入坑教程》 - 3.AutoMapper & Restful API & DIASP.NETVueAPPRESTAPI
- ASP.NET Core 中的快取ASP.NET快取
- .net core中的哪些過濾器過濾器
- 聊聊ASP.NET Core中的配置ASP.NET
- .NET 5/.NET Core使用EF Core 5連線MySQL資料庫寫入/讀取資料示例教程MySql資料庫
- 基於 abp vNext 和 .NET Core 開發部落格專案 - 用AutoMapper搞定物件對映APP物件
- Asp.NetCore之AutoMapper進階篇ASP.NETNetCoreAPP
- ASP.NET CORE微信支付回撥示例程式碼ASP.NET
- (精華)2020年7月3日 ASP.NET Core AutoMapper實現類的相互對映(工具版)ASP.NETAPP
- ASP.NET Core 中的管道機制ASP.NET
- ASP.NET Core 中的依賴注入ASP.NET依賴注入
- 關於 .NET Core(.NET Core 指南)