如何在 .NetCore 中使用 AutoMapper 高階功能
AutoMapper 是一個基於約定的物件導向的對映器,它的功能常用於將一個 input 物件 轉成一個不同型別的 output 物件,input 和 output 物件之間的屬性可能相同也可能不相同,這一篇我們來一起研究一下 AutoMapper 的一些高階玩法。
安裝 AutoMapper
要想在專案中使用 AutoMapper
,需要透過 nuget 引用 AutoMapper
和 AutoMapper.Extensions.Microsoft.DependencyInjection
包,可以透過 Visual Studio 2019 的 NuGet package manager
視覺化介面安裝 或者 透過 NuGet package manager
命令列工具輸入以下命令:
Install-Package AutoMapper
Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection
配置 AutoMapper
一旦 AutoMapper 成功安裝之後,接下來就可以將它引入到 ServiceCollection 容器中,如下程式碼所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddAutoMapper(typeof(AuthorProfile));
}
使用 profiles 統一管理 mapping 資訊
可以使用 profiles 來統一組織你的 mapping 資訊,要建立 profile,需要實現 AutoMapper 提供的 Profile 類,然後在你剛才建立的 Profile 子類的建構函式中新增對映資訊,下面的程式碼展示瞭如何建立一個從 Proifle 繼承的 AuthorProfile
類以及相關資訊。
public class AuthorProfile : Profile
{
public AuthorProfile()
{
CreateMap();
}
}
接下來再看 AuthorModel 和 AuthorDTO 兩個物件的定義:
public class AuthorModel
{
public int Id
{
get; set;
}
public string FirstName
{
get;set;
}
public string LastName
{
get; set;
}
public string Address
{
get; set;
}
}
public class AuthorDTO
{
public int Id
{
get; set;
}
public string FirstName
{
get; set;
}
public string LastName
{
get; set;
}
public string Address
{
get; set;
}
使用 ReverseMap()
值得注意的是,上面的示例是一種 單向流動
,這是什麼意思呢? 舉個例子吧,下面是 單向流動
的一段程式碼。
AutoMapper.Mapper.CreateMap();
有了這個 Map,接下來就可以輕鬆實現 AuthorDTO 到 AuthorModel 的轉換,程式碼如下:
var authorModel = AutoMapper.Mapper.Map(author);
假設因為某種原因,你需要將 authorModel 例項反轉成 authorDTO,這時你用瞭如下的程式碼段。
var author = AutoMapper.Mapper.Map(authorModel);
很遺憾,這種方式註定會丟擲異常,這是因為 AutoMapper 並不知道如何實現 authorModel 到 authorDTO 的轉換,畢竟你沒有定義此種 map 的對映流向,那怎麼解決呢? 可以再定義一個 CreateMap 對映哈,其實沒必要,簡單粗暴的做法就是呼叫 ReverseMap
即可,實現程式碼如下:
AutoMapper.Mapper.CreateMap().ReverseMap();
使用 ForMember() 和 MapFrom()
這一節我們繼續使用之前說到的 AuthorModel 和 AuthorDTO 類,下面的程式碼片段展示瞭如何將 AuthorModel 轉成 AuthorDTO 。
var author = new AuthorModel();
author.Id = 1;
author.FirstName = "Joydip";
author.LastName = "Kanjilal";
author.Address = "Hyderabad";
var authorDTO = _mapper.Map(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 中更新一下 mapping 資訊,如下程式碼所示:
public class AuthorProfile : Profile
{
public AuthorProfile()
{
CreateMap().ForMember(destination => destination.Address, map => map.MapFrom(source => source.Address1));
}
}
使用 NullSubstitute
何為 NullSubstitute
呢?大意就是在對映轉換的過程中,將input 為null 的屬性對映之後做自定義處理,比如在 ouput 中改成 No Data
,下面的程式碼展示瞭如何去實現。
AutoMapper.Mapper.CreateMap().ForMember(destination => destination.Address, opt => opt.NullSubstitute("No data"));
mapping 的 AOP 攔截
考慮下面的兩個類。
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)
});
當 mapping 執行完之後,可以在 目標物件 上 安插 AfterMap()
方法,下面的程式碼展示瞭如何去實現。
public OrderDTO MapAuthor(IMapper mapper, OrderDTO orderDTO)
{
return mapper.Map(orderDTO, opt =>
{
opt.AfterMap((src, dest) =>
{
dest.NumberOfItems = _orderService.GetTotalItems(src);
});
});
}
使用巢狀對映
AutoMapper 同樣也可以使用巢狀對映,考慮下面的 domain 類。
public class Order
{
public string OrderNumber { get; set; }
public IEnumerable OrderItems { get; set; }
}
public class OrderItem
{
public string ItemName { get; set; }
public decimal ItemPrice { get; set; }
public int ItemQuantity { get; set; }
}
接下來再看一下 DTO 類。
public class OrderDto
{
public string OrderNumber { get; set; }
public IEnumerable OrderItems { get; set; }
}
public class OrderItemDto
{
public string ItemName { get; set; }
public decimal ItemPrice { get; set; }
public int ItemQuantity { get; set; }
}
最後看看如何在轉換的過程中使用 mapping 的。
var orders = _repository.GetOrders();
Mapper.CreateMap();
Mapper.CreateMap();
var model = Mapper.Map, IEnumerable>(orders);
AutoMapper 讓你用最小化的配置實現了物件之間的對映,同時也可以實現自定義的解析器來實現具有完全不同結構物件之間的對映,自定義解析器可以生成與目標物件具有相同結構的exchange,以便AutoMapper在執行時可以據其實現對映。
更多高質量乾貨:參見我的 GitHub: [csharptranslate] github.com/ctripxchuang/csharptranslate
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2370/viewspace-2826946/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Asp.NetCore之AutoMapper進階篇ASP.NETNetCoreAPP
- .Net Core中更高階的AutoMapper示例APP
- C++高階功能C++
- 如何在 Blazor WebAssembly中 使用 功能開關BlazorWeb
- redis學習——高階功能Redis
- Nginx高階功能詳解Nginx
- Asp.NetCore之AutoMapper基礎篇ASP.NETNetCoreAPP
- Python中函式的高階使用Python函式
- Elasticsearch系列---幾個高階功能Elasticsearch
- 高階BOM工具智慧打包功能
- 深入探索LangChain的高階功能LangChain
- 理解pytorch幾個高階選擇函式(如gather)PyTorch函式
- Maven高階使用Maven
- .NETCore 簡單且高階的庫 csredis v3.0.0NetCoreRedis
- TypeScript在React高階元件中的使用技巧TypeScriptReact元件
- Nacos的一些高階功能
- .NET Core 中AutoMapper的配置及使用APP
- .netcore利用perf分析高cpu使用率NetCore
- NetCore高階系列文章04---async、await原理揭秘NetCoreAI
- Nginx的高階使用Nginx
- ModelSerializer 高階使用
- 如何在Mac上使用“接力”功能?Mac
- 如何在Windows8中開啟與使用磁碟清理功能Windows
- AutoMapper在ABP框架中的使用說明APP框架
- netcore高階知識點,記憶體對齊,原理與示例NetCore記憶體
- React中的高階元件React元件
- netcore專案中IStartupFilter使用NetCoreFilter
- Prism+WPF使用DependencyInjection實現AutoMapper的依賴注入功能APP依賴注入
- React高階元件的使用React元件
- 高階函式的使用函式
- python中list列表的高階應用 高階函式Python函式
- 如何在MacOS中使用疊放功能Mac
- Java初級~中級~高階進階之路Java
- .net framework autoMapper使用FrameworkAPP
- .net Core 使用AutoMapperAPP
- 醫療刺激裝置如何使用外部儲存器來支援高階功能
- Kotlin——高階篇(二):高階函式詳解與標準的高階函式使用Kotlin函式
- 如何使用TensorFlow中的高階API:Estimator、Experiment和DatasetAPI