.net core 中使用AutoMapper對映 簡單易懂
一、為什麼使用AutoMapper
AutoMapper的功效其實就是把一個物件裡面的value 對映 也就是複製到另一個物件,
比如我們有一個介面用來接收第三方資料的,接收了一個物件裡面有很多欄位,但是呢,
在我們需要儲存到資料庫的時候,欄位名稱不一樣甚至有一些連型別都不一樣
這就需要我們自己的model類與傳遞過來的model類進行對映,A.name =B.Name ,A.sex = B.gender 這樣的程式碼就會增多
而且如果改動某一個欄位或者刪除某一個欄位,那麼就要把程式碼中這樣的程式碼全部處理,灰常不方便,於是乎,我們選擇了AutoMapper來對映
好處就是,名字相同的我們不需要處理,欄位數量不對等也不會報錯,程式碼整潔 不會左一塊右一快。
接下來我們要在專案中使用AutoMapper來處理物件之間的對映。
在model層新建一個資料夾起名叫ViewModel 然後在下面 新建一個UserViewModel 實體類 程式碼如下
using System; using System.Collections.Generic; using System.Text; namespace WebApi.Core.Model.ViewModel { /// <summary> /// User資料的展示實體 /// </summary> public class UserViewModel {/// <summary> /// ID /// </summary> public int UserId { get; set; } /// <summary> /// 使用者名稱 /// </summary> public string UserName { get; set; } /// <summary> /// 年齡 /// </summary> public int? Age { get; set; } /// <summary> /// 生日 /// </summary> public string Birthday { get; set; } /// <summary> /// 手機 /// </summary> public string Phone { get; set; } /// <summary> /// 地址 /// </summary> public string Address { get; set; } } }
Service層中引用Nuget包 AutoMapper 和AutoMapper.Extensions.Microsoft.DependencyInjection
在Api層新增AutoMapper資料夾,然後新增對映配置檔案CustomProfile.cs 用來匹配所有的對映物件關係
程式碼如下
using AutoMapper; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using WebApi.Core.Model; using WebApi.Core.Model.ViewModel; namespace WebApi.Core.Api.AutoMapper { public class CustomProfile:Profile { /// <summary> /// 配置建構函式,用來建立關係對映 /// </summary> public CustomProfile() { CreateMap<UsersModel, UserViewModel>(); } } }
注入服務 找到Startup.cs 在ConfiguService中 新增AutoMapper
這就算完成了AutoMapper的服務注入,接下來我們研究一下怎麼用
首先在IUserService 新增一個方法GetUserDetails,程式碼如下
using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using WebApi.Core.IService.Base; using WebApi.Core.Model; using WebApi.Core.Model.ViewModel; namespace WebApi.Core.IService { public interface IUserService:IBaseService<UsersModel> { /// <summary> /// 測試sqlSugar 常用語句 /// </summary> void testSqlSugar(); /// <summary> /// 獲取使用者詳情資料 /// </summary> /// <param name="id"></param> /// <returns></returns> Task<UserViewModel> GetUserDetails(int id); } }
在UserService中例項這個方法,程式碼如下
using AutoMapper; using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using WebApi.Core.IRepository; using WebApi.Core.IRepository.Base; using WebApi.Core.IService; using WebApi.Core.Model; using WebApi.Core.Model.ViewModel; using WebApi.Core.Service.Base; namespace WebApi.Core.Service { public class UserService:BaseService<UsersModel>,IUserService { //宣告常量 private readonly IUserRepository userService; private readonly IMapper iMapper; public UserService(IBaseRepository<UsersModel> baseRepository, IUserRepository usersSer,IMapper mapper):base(baseRepository) { userService = usersSer; iMapper = mapper; } /// <summary> /// 測試sqlSugar 常用語句 /// </summary> public void testSqlSugar() { userService.testSqlSugar(); } /// <summary> /// 獲取使用者詳情資料 /// </summary> /// <param name="id"></param> /// <returns></returns> public async Task<UserViewModel> GetUserDetails(int id) { var userInfo = await userService.QueryByID(id); if (userInfo != null) { UserViewModel model = iMapper.Map<UserViewModel>(userInfo); return model; } else { return null; } } } }
然後在UserORMController 加一個測試介面 程式碼如下
/// <summary> /// 測試automapper /// </summary> /// <returns></returns> [HttpPost] public async Task<IActionResult> AutoMapper(int id) { var userinfo = await userService.GetUserDetails(id); return Ok(userinfo); }
F5啟動除錯一下 看看結果,這就是AutoMapper了,當你的實體類越來越多 業務也越來越複雜的時候,就能體現出這種對映的好處了
這裡注意一下 這個是單向對映的,不是雙向哦,也就是說 UserModel,對映到UserViewModel 可以。。
反過來 把UserViewModel對映到UserModel裡面是不行的,需要在加一個 CreateMap<UserViewModel,UserModel>
接下來我們在測試一下,名稱不一樣,在加上子類,在反向處理,獲取一個json然後存入到資料庫
首先新建一個資料夾取名字叫Entity 然後建立一個BaseEntity 類,在建立一個測試model類TestAutoMapper
程式碼 如下
using System; using System.Collections.Generic; using System.Text; namespace WebApi.Core.Model.Entity { public class BaseEntity { public int page { get; set; } public int size { get; set; } } }
using System; using System.Collections.Generic; using System.Text; using WebApi.Core.Model.Entity; namespace WebApi.Core.Model { public class TestAutoMapper:BaseEntity { /// <summary> /// 對應UserId /// </summary> public int id { get; set; } /// <summary> /// 姓名 /// </summary> public string UserName { get; set; } /// <summary> /// 對應Age /// </summary> public int yearDate { get; set; } /// <summary> /// 存一個list 存放 子表 /// </summary> public List<TokenModel> tokenList { get; set; } } }
然後在IUserService 和UserService 新增方法,程式碼如下
/// <summary> /// 獲取資料插入到資料庫 放到IUserService裡面 /// </summary> /// <param name="userviewmodel"></param> /// <returns></returns> Task<bool> AddUserByViewModel(TestAutoMapper testmodel);
/// <summary> /// 獲取資料插入到資料庫 放到UserService裡面 /// </summary> /// <param name="userviewmodel"></param> /// <returns></returns> public async Task<bool> AddUserByViewModel(TestAutoMapper testmodel) { if (testmodel != null) { UsersModel userinfo = iMapper.Map<UsersModel>(testmodel); return await userService.Add(userinfo); } else { return false; } }
最後在配置一下AutoMapper對映 在Api 的CustomProfile.cs 裡面程式碼如下
using AutoMapper; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using WebApi.Core.Model; using WebApi.Core.Model.ViewModel; namespace WebApi.Core.Api.AutoMapper { public class CustomProfile:Profile { /// <summary> /// 配置建構函式,用來建立關係對映 /// </summary> public CustomProfile() { CreateMap<UsersModel, UserViewModel>() .ForMember(d=>d.Phone,o=>o.MapFrom(s=>s.Age)); CreateMap<TestAutoMapper, UsersModel>() .ForMember(d=>d.UserId,o=>o.MapFrom(s=>s.id)) .ForMember(d=>d.Age,o=>o.MapFrom(s=>s.yearDate)) .ForMember(d=>d.UserName,o=>o.MapFrom(s=>JsonConvert.SerializeObject(s.tokenList))); } } }
在UserORMController裡面新增介面測試
/// <summary> /// 測試AutoMapper反向對映,插入到資料庫 /// </summary> /// <param name="testmodel"></param> /// <returns></returns> [HttpPost] public async Task<IActionResult> AutoMapperReverse(TestAutoMapper testmodel) { var result = await userService.AddUserByViewModel(testmodel); return Ok(result); }
我們按F5 除錯一下,可以看到已經成功了,其實很簡單,就是把一個物件的值,複製到另一個物件中,其中的值可以隨意轉變,靈活控制
資料也成功的插入進去了,不管是繼承了什麼子類 只要是名字一樣的autoMapper 都會找到 然後對映過去,如果不想那麼做,就單獨對映那個欄位
這個AutoMapper 今天就到這兒了,使用應該已經沒什麼困難了,後期再補充一些底層的東西,怎麼對映的,如何實現的等等。