AutoMapper 可以進行複雜的與客制情境的轉換物件。有許多複雜且多情境的轉換,會先以基本轉換做運作說明。
AutoMapper 的官網有這麼一段:
Why use AutoMapper? Mapping code is boring. Testing mapping code is even more boring...
如果已經有寫好的套件,就不需要再手動去發明輪子了。物件對物件的轉換就交給 AutoMapper 讓專案更有 clean code 的特徵。
接著介紹 AutoMapper 在注入 Controller 建構子前所做的準備工作。
於 .net core 的專案中,類別 Startup 的 ConfigureServices 方法將註冊服務。註冊服務會先建立 AutoMapper.Profile,其中包含要轉換型態來源與目的。
首先新增實體 AutoMapper.MapperConfiguration ,於建構子呼叫自己的 Build 方法,傳入Action configure 委派函式,於此範例就是:
mc => { mc.AddProfile(new ProductProfile());
Build 方法會先取得參數;參數即傳入此委派的函式,Build方法會先新增 AutoMapper.MapperConfigurationExpression 實體,將此實體傳入委派函式執行,接著呼叫 MapperConfigurationExpression.AddProfile。
其傳入 MapperConfigurationExpression.AddProfile 方法的的參數於此範例是:
new ProductProfile()
ProductProfile類別的定義如下:
public class ProductProfile : Profile
{
public ProductProfile()
{
CreateMap<Product, ProductDTO>();
}
}
來源 Product 與 目的 ProductDTO 定義如下:
public class Product
{
public int Id
{
get;
set;
}
public string Name
{
get;
set;
}
public string Description
{
get;
set;
}
public double Discount
{
get;
set;
}
public double Price
{
get;
set;
}
}
public class ProductDTO
{
public int Id
{
get;
set;
}
public string Name
{
get;
set;
}
public string Description
{
get;
set;
}
public double Discount
{
get;
set;
}
public double Price
{
get;
set;
}
}
ProductProfile類別繼承AutoMapper.Profile類別,所以呼叫建構子立即執行父類別的 CreateMap<TSource, TDestination>() ;
如圖隨即呼叫 CreateMapCore <TSource, TDestination>() 。 此 Method 執行二個步驟,如圖 S1 步驟,新增類別 MappingExpression 的實體,此實體繼承了MappingExpressionBase 類別。
S2步驟,新增 struct TypePair,將來源指定到欄位 SourceType (此範例為Product) 與 目的指定到欄位 DestinationType (此範例為ProductDTO)。
將此struct 再存放到 MappingExpressionBase.Types 欄位。
最後將此MappingExpression 的實體存放到 AutoMapper.Profile類別的 List _typeMapConfigs。
此profile參數準備好後,開始執行 MapperConfigurationExpression.AddProfile,也就是將 ProductProfile類別實體存放到 MapperConfigurationExpression 的 List _profiles欄位。
最後將MapperConfigurationExpression 傳入 AutoMapper.MapperConfiguration 自己的建構子中做相關設定。
其中一個設定是 prfile 的設定,會將剛剛 MapperConfigurationExpression 的 List _profiles欄位 轉換到 AutoMapper.MapperConfiguration 的 ProfileMap[] Profiles 類別陣列裡。
最後回到 .net core 專案, 類別 Startup 的 ConfigureServices 方法將註冊服務 Mapper:
public void ConfigureServices(IServiceCollection services)
{
...
IMapper mapper = mapperConfig.CreateMapper();
services.AddSingleton(mapper);
...
}
所以注入到 Controller 建構子前,在這邊要把對應的類別,也就是要轉換的類別都設定好。
以上是準備工作,下一節將看如何運作轉換類別對應。