利用AutoMapper實現資料實體類之間的轉換
在分解複雜的軟體系統時,軟體設計者用得最多的技術之一就是分層。分層右很多優點:如提高複用性、較低耦合性,但也有其缺陷所在:如過多的層次會影響效能、有時會為我們帶來級聯修改。
會帶來級聯修改怎麼理解呢?例如需求變化要增加一個在使用者介面上顯示的資料域,就必須在資料中增加相應欄位,還必須在使用者介面和資料庫之間的每一層做相應的修改。在不同層次中會有不同的資料實體類(有些類還包括一些方法),這些實體類之間為了實現資料傳遞就必須進行類之前的轉換,這樣的轉換可以手寫程式碼進行一對一的轉換完成任務,就像下圖一樣,並且你還得為對應的List<T>類書寫相應的轉換方法,有木有更簡單方便的方案呢?這就要說到標題裡寫的AutoMapper,從名字可以看出這是一款用於對映的工具。
直接上程式碼,第一先定義需要進行轉換的實體類,第二步是繼承Profile介面,進行註冊。
using AutoMapper; namespace WindowsFormsApp1 { /// <summary> /// 模仿需要轉換的資料實體類 /// </summary> public class Source { public int SomeValue { get; set; } public string AnotherValue { get; set; } } /// <summary>/// 模仿需要轉換的資料實體類 /// </summary> public class Destination { public int SomeValue { get; set; } } /// <summary> /// 通過Profile註冊 /// 告訴AutoMapper需要進行哪些類的轉換,如果A轉換成B,B也要轉換成A,那就需要寫兩條 /// </summary> public class SourceProfile : Profile { public SourceProfile() { CreateMap<Source, Destination>(); CreateMap<Destination, Source>(); } } }
第三步是將Profile中書寫的對映關係新增到Mapper例項,常規需要書寫一個方法用於獲取唯一的Mapper例項(單例模式),例項中配置了對映關係。
using AutoMapper; namespace WindowsFormsApp1 { public class AutoMapperConfigure { public static IMapper GetMapper() { var config = new MapperConfiguration(cfg => { // 掃描當前程式集 cfg.AddMaps(System.AppDomain.CurrentDomain.GetAssemblies()); }); var mapper = config.CreateMapper(); return mapper; } } }
第四步具體呼叫,預設情況下,AutoMapper 基於相同的欄位名對映,並且是 不區分大小寫 的。也可以通過修改配置,實現AutoMapper提供的命名規則對映。LowerUnderscoreNamingConvention
和 PascalCaseNamingConvention
是 AutoMapper 提供的兩個命名規則。前者命名是小寫幷包含下劃線,後者就是帕斯卡命名規則(每個單詞的首字母大寫)。
private void promptMessageButton_Click(object sender, EventArgs e) { Source source = new Source() { SomeValue = 1, AnotherValue = "Another" }; var mapper = AutoMapperConfigure.GetMapper(); Destination destination = mapper.Map<Destination>(source); MessageBox.Show(destination.SomeValue.ToString()); }
參考資料:https://www.cnblogs.com/gl1573/p/13098031.html
有興趣的同學還可以看一下官方文件,還有樣例:https://docs.automapper.org/en/latest/
看了部落格的同學建議還是自己動手寫一下,借用荀子的一句話:不聞不若聞之,聞之不若見之,見之不若知之,知之不若行之。