隨著技術的發展,ASP.NET Core MVC也推出了好長時間,經過不斷的版本更新迭代,已經越來越完善,本系列文章主要講解ASP.NET Core MVC開發B/S系統過程中所涉及到的相關內容,適用於初學者,在校畢業生,或其他想從事ASP.NET Core MVC 系統開發的人員。 經過前幾篇文章... ...
隨著技術的發展,ASP.NET Core MVC也推出了好長時間,經過不斷的版本更新迭代,已經越來越完善,本系列文章主要講解ASP.NET Core MVC開發B/S系統過程中所涉及到的相關內容,適用於初學者,在校畢業生,或其他想從事ASP.NET Core MVC 系統開發的人員。 經過前幾篇文章的講解,初步瞭解ASP.NET Core MVC項目創建,啟動運行,以及命名約定,創建控制器,視圖,模型,接收參數,傳遞數據ViewData,ViewBag,路由,頁面佈局,wwwroot和客戶端庫,Razor語法,EnityFrameworkCore與資料庫,HttpContext,Request,Response,Session,序列化,文件上傳等內容,今天繼續講解ASP.NET Core MVC 中自動映射等相關內容,僅供學習分享使用。
手動映射
在實際應用中,隨著程式複雜度越來越高,分層已經是必然趨勢,對象的傳遞與映射,也變得很頻繁。在小項目中,一般採用手動映射賦值,如:將StudentViewModel對象的屬性值賦值給Student。手動映射如下所示:
1 [HttpPost] 2 public IActionResult Add(StudentViewModel studentViewModel) 3 { 4 var student = new Student() 5 { 6 Id = studentViewModel.Id, 7 Name = studentViewModel.Name, 8 Age = studentViewModel.Age, 9 Sex = studentViewModel.Sex, 10 }; 11 studentService.Add(student); 12 return View(); 13 }
手動映射需要逐個屬性進行賦值,靈活度高,但也容易出錯。如果項目中存在很多需要映射傳遞的地方,則工作量和複雜度也會隨之增加。
自動映射快速入門
自動映射就是由程式自動匹配屬性名併進行賦值。步驟如下:
1. 安裝自動映射包
首先通過NuGet包管理器安裝自動映射第三方庫【AutoMapper.Extensions.Microsoft.DependencyInjection】,目前版本為12.0.1,如下所示:
2. 創建自動映射關係
創建自動映射關係類AutomapProfile,並繼承自Profile,如下所示:
1 using AutoMapper; 2 using DemoCoreMVC.ViewModels; 3 using DemoCoreMVC.Models; 4 5 namespace DemoCoreMVC.Profiles 6 { 7 public class AutomapProfile:Profile 8 { 9 public AutomapProfile() 10 { 11 //創建映射關係 12 CreateMap<StudentViewModel, Student>(); 13 } 14 } 15 }
3. 註冊自動映射服務
在Program啟動文件中,添加自動映射服務,在服務中添加映射關係類,如下所示:
1 builder.Services.AddAutoMapper(cfg => 2 { 3 cfg.AddProfile<AutomapProfile>(); 4 }); 5 //或者 6 //builder.Services.AddAutoMapper(typeof(AutomapProfile));
4. 註入IMapper介面
在需要使用自動映射服務的地方註入IMapper服務,如控制器中,如下所示:
1 private readonly IMapper mapper; 2 3 public StudentController(IStudentService studentService,IMapper mapper) 4 { 5 this.studentService = studentService; 6 this.mapper = mapper; 7 }
5. 調用映射方法
在需要映射的地方調用IMapper介面的Map方法,如下所示:
1 [HttpPost] 2 public IActionResult Add(StudentViewModel studentViewModel) 3 { 4 var student = mapper.Map<StudentViewModel, Student>(studentViewModel); 5 studentService.Add(student); 6 return View(); 7 }
6. 自動映射示例
經過上述步驟,自動映射已經完成,經過測試如下所示:
多個關係映射文件
在實際應用中,會有很多對象需要映射,通常會根據不同的類型,創建多個關係映射類,則在項目啟動註冊自動映射服務時,需要載入多個映射類,如下所示:
1 builder.Services.AddAutoMapper(cfg => 2 { 3 cfg.AddProfile<AutomapProfile>(); 4 cfg.AddProfile<CompanyProfile>(); 5 });
也可以通過掃描程式集的方式載入映射文件,可以配置程式集名稱,程式會自動掃描繼承了Profile類的文件。如下所示:
1 builder.Services.AddAutoMapper(cfg => 2 { 3 cfg.AddMaps("DemoCoreMVC"); 4 });
註意AddMaps參數配置的是程式集名稱,而不是命名空間,程式集名稱可通過項目屬性獲取,如下所示:
自動映射匹配
預設情況下,自動映射的數據源和目標的屬性,必須要一致,才能進行映射,但是在實際應用中,屬性名之間可能會存在差異,如書寫格式【Class_Name和ClassName之間的差異】等,如果不加處理的話,預設是無法自動映射成功的。失敗示例如下所示:
在映射時進行配置源的命名格式和目標命名格式,如下所示:
1 namespace DemoCoreMVC.Profiles 2 { 3 public class AutomapProfile:Profile 4 { 5 public AutomapProfile() 6 { 7 SourceMemberNamingConvention = new LowerUnderscoreNamingConvention(); 8 DestinationMemberNamingConvention = new PascalCaseNamingConvention(); 9 //創建映射關係 10 CreateMap<StudentViewModel, Student>(); 11 } 12 } 13 }
註意:其中
SourceMemberNamingConvention :源類型成員命名規則 Ex: SourceMemberNamingConvention = new LowerUnderscoreNamingConvention(); //下劃線命名法 DestinationMemberNamingConvention :目標類型成員命名規則 Ex: cfg.DestinationMemberNamingConvention = new PascalCaseNamingConvention(); //帕斯卡命名法經過設置源類型和目標類型的命名規則後,則發現已經可以適配成功。如下所示:
經過測試,以下全局配置命名規則不生效,具體原因不知:
1 builder.Services.AddAutoMapper(cfg => 2 { 3 cfg.AddProfile<AutomapProfile>(); 4 cfg.SourceMemberNamingConvention = new LowerUnderscoreNamingConvention(); 5 cfg.DestinationMemberNamingConvention = new PascalCaseNamingConvention(); 6 });
以上就是ASP.NET Core MVC從入門到精通之自動映射第一部分內容。旨在拋磚引玉,一起學習,共同進步。
作者:小六公子
出處:http://www.cnblogs.com/hsiang/
本文版權歸作者和博客園共有,寫文不易,支持原創,歡迎轉載【點贊】,轉載請保留此段聲明,且在文章頁面明顯位置給出原文連接,謝謝。
關註個人公眾號,定時同步更新技術及職場文章