iT邦幫忙

2022 iThome 鐵人賽

DAY 23
1
自我挑戰組

[Dot Net Core](圖解系列與常用套件)系列 第 23

[Dot Net Core](圖解系列) 23. AutoMapper - Process of that Registering package into DI

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20220923/20144614GG7lTWOu37.jpg

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,其中包含要轉換型態來源與目的。

https://ithelp.ithome.com.tw/upload/images/20220923/20144614CdPioD3uBZ.jpg

首先新增實體 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;
        }
}

https://ithelp.ithome.com.tw/upload/images/20220923/20144614Kzd1D3ChXX.jpg

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。

https://ithelp.ithome.com.tw/upload/images/20220923/20144614j1dHVt4oTF.jpg

此profile參數準備好後,開始執行 MapperConfigurationExpression.AddProfile,也就是將 ProductProfile類別實體存放到 MapperConfigurationExpression 的 List _profiles欄位。
最後將MapperConfigurationExpression 傳入 AutoMapper.MapperConfiguration 自己的建構子中做相關設定。

https://ithelp.ithome.com.tw/upload/images/20220923/20144614F4nykXSXIG.jpg

其中一個設定是 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 建構子前,在這邊要把對應的類別,也就是要轉換的類別都設定好。

以上是準備工作,下一節將看如何運作轉換類別對應。


上一篇
[Dot Net Core](延伸應用) 22. Event-driven Application - Using Queue to simulate operation
下一篇
[Dot Net Core](圖解系列) 24.AutoMapper - Implement Mapping object
系列文
[Dot Net Core](圖解系列與常用套件)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言