[AutoMapper] AutoMapper 5.0.2 的新寫法

在 4.2 的時候,CreateMap 方法只是被標記過時

到了 5.0.2 的時候,這些過時的方法,已經被拔掉,改由 MapperConfiguration 取代,一旦升級到 5.0.2 就勢必要面臨改寫程式,也獲得到超高效能
https://lostechies.com/jimmybogard/2016/06/24/automapper-5-0-speed-increases/

靜態方法固然方便,但是有很多的雷要注意,請參考以下:
http://www.infoq.com/cn/news/2016/03/static-functions

作者為了保持 API 的調用方便,仍用靜態方法封裝,所以骨子裡還是非靜態的物件靜態方法,不管理狀態,也就是要由外部傳遞狀態給方法,雖然麻煩了點,但是彈性跟效能都提升了,這次演進的過程,跟我日常的設計一樣,沒有衝突

以往的靜態設定讓我不知如何抽換設定,比如同一個物件要有多個對應的方法,記得某一年的 Techday 有跟大神 Kevin 過,內容有點忘了,最後我決定不要用多組對應,只用 Mapper 幫我對應第一組,其他的對應自己刻
現在,不需要自己刻了

回顧一下舊的寫法,版本 5 以前應該都有效,沒時間測版本 3

  • 版本 4.2 以後,可以改用 MapperConfiguration
  • 版本 5 以後,強制使用 MapperConfiguration

基本用法

Old

var order = new Order() { };
Mapper.CreateMap<Order, OrderViewModel>();
Mapper.AssertConfigurationIsValid();//←證驗應對
var orderView=Mapper.Map<Order, OrderViewModel>(order);

New

var order = new Order() { };
var config = new MapperConfiguration(cfg => cfg.CreateMap<Order, OrderViewModel>());
config.AssertConfigurationIsValid();//←證驗應對
var mapper = config.CreateMapper();
var orderView = mapper.Map<OrderViewModel>(order);


Profile

若對 Profile 不熟可以參考以下連結
https://dotblogs.com.tw/yc421206/2014/12/12/147619

由文件比對可以得知舊的 Override Configure 被拔掉了,改用建構函數

https://github.com/AutoMapper/AutoMapper/wiki/Configuration/_compare/dbd9e063ccc90f3cba089dc2cf491d611b557e6b

public class OrganizationProfile : Profile
{
	protected override void Configure()//←過時
	{
		CreateMap<Order, OrderViewModel>();
		//Use CreateMap... Etc.. here (Profile methods are the same as configuration methods)  
	}
	public OrganizationProfile()
	{
		CreateMap<Order, OrderViewModel>();
		// Use CreateMap... Etc.. here (Profile methods are the same as configuration methods)  
	}
}

 

Old

Mapper.Initialize(x => x.AddProfile<AS400MapSqlProfile>());←可以繼續用
Mapper.AddProfile<SqlMapperProfile>();←被拔掉

or

Mapper.Initialize(config =>
{
    config.AddProfile<AS400MapSqlProfile>();
    config.AddProfile<SqlMapperProfile>();
});


New

var config = new MapperConfiguration(cfg =>
{
    cfg.AddProfile<AS400MapSqlProfile>();
    cfg.AddProfile<SqlMapperProfile>();
});

 

未來我會這樣用

通過 MapperConfiguration 建立設定執行個體 var config = new MapperConfiguration(),可依實際需求載入不同的設定

再透過它調用 CreateMap() 進行對應,var mapper=config.CreateMap(),mapper.Map()

新版本舊寫法

若近期內無法改用非靜態方法,原本的專案內還是充斥的一堆 Mapper.Map,根本離不開它,不用擔心這個方法仍有支援,使用前記得先呼叫 Mapper.Initialize

參考資源

https://github.com/AutoMapper/AutoMapper/wiki/5.0-Upgrade-Guide

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo