在 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 被拔掉了,改用建構函數
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