一、什麼是AutoMapper? AutoMapper是一個簡單的對象映射框架(OOM),將一個對象映射到另一個對象。 二、AutoMapper的好處 以前的時候我們將DTO對象轉換為Model對象時,我們必須將每一個屬性都手動映射 實體類 /// <summary> /// 用戶表 /// </s ...
一、什麼是AutoMapper?
AutoMapper是一個簡單的對象映射框架(OOM),將一個對象映射到另一個對象。
二、AutoMapper的好處
以前的時候我們將DTO對象轉換為Model對象時,我們必須將每一個屬性都手動映射
實體類
/// <summary> /// 用戶表 /// </summary> [Table("tb_User")] public class TbUser { /// <summary> /// 用戶Id /// </summary> [Key] [Column("userId")] [StringLength(32)] public string UserId { get; set; } /// <summary> /// 用戶名 /// </summary> [Column("userName")] [StringLength(20)] public string UserName { get; set; } /// <summary> /// 郵箱 /// </summary> [Column("email")] [StringLength(30)] public string Email { get; set; } /// <summary> /// 添加時間 /// </summary> [Column("addTime")] [Required] public DateTime AddTime { set; get; } }
DTO傳輸對象
/// <summary> /// 用戶傳輸對象 /// </summary> public class UserDto { /// <summary> /// 用戶Id /// </summary> [StringLength(32, ErrorMessage = "{0}最多{1}個字元"), Display(Name = "用戶Id")] public string UserId { get; set; } /// <summary> /// 用戶名 /// </summary> [StringLength(20, ErrorMessage = "{0}最多{1}個字元"), Display(Name = "用戶名")] public string UserName { get; set; } /// <summary> /// 郵箱 /// </summary> [StringLength(30, ErrorMessage = "{0}最多{1}個字元"), Display(Name = "郵箱")] public string Email { get; set; } }
業務層
/// <summary> /// 業務處理 /// </summary> public class UserService : IUserService { private readonly MyDbContext _dbContext; /// <summary> /// 構造函數 /// </summary> /// <param name="dbContext"></param> public UserService(MyDbContext dbContext) { _dbContext = dbContext; } /// <summary> /// 添加用戶 /// </summary> /// <param name="dto">實體傳輸對象</param> /// <returns></returns> public int Add(UserDto dto) { var user = new TbUser { UserId = Guid.NewGuid().ToString("N"), Email = dto.Email, UserName = dto.UserName, AddTime = DateTime.Now }; _dbContext.Add(user); return _dbContext.SaveChanges(); } /// <summary> /// 編輯用戶信息 /// </summary> /// <param name="dto">實體傳輸對象</param> /// <returns></returns> public int Update(UserDto dto) { var user = _dbContext.TbUsers.Find(dto.UserId); if(user==null) throw new Exception("獲取用戶信息失敗"); user.UserName = dto.UserName; user.Email = dto.Email; return _dbContext.SaveChanges(); } }
這樣情況還可以,屬性不是很多,如果屬性過多(幾十,幾百),還需要手動賦值,簡直太頭疼了,還會導致大量的時間浪費在對象轉換中,用AutoMapper,只需要簡單的配置就可以完成兩個對象之間的屬性映射,開發中省去了屬性轉換的時間,從而提高工作效率。
三、使用AutoMapper
安裝引用
通過程式包管理器控制台安裝AutoMapper
Install-Package AutoMapper -version 9.0.0
Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection -version 7.0.0
配置映射關係
創建一個類並繼承autoMapper的Profile類
public class Mappings : Profile { public Mappings() { CreateMap<UserDto, TbUser>(); } }
註入服務
//註入AutoMapper服務,Mappings就是自己創建的映射類 services.AddAutoMapper(typeof(Mappings));
修改業務層代碼
/// <summary> /// 業務處理 /// </summary> public class UserService : IUserService { private readonly MyDbContext _dbContext; /// <summary> /// 註入介面 /// </summary> private readonly IMapper _mapper; /// <summary> /// 構造函數 /// </summary> /// <param name="dbContext"></param> /// <param name="mapper"></param> public UserService(MyDbContext dbContext,IMapper mapper) { _dbContext = dbContext; _mapper = mapper; } /// <summary> /// 添加用戶 /// </summary> /// <param name="dto">實體傳輸對象</param> /// <returns></returns> public int Add(UserDto dto) { var info = _mapper.Map<UserDto, TbUser>(dto); info.AddTime=DateTime.Now; info.UserId = Guid.NewGuid().ToString("N"); //var user = new TbUser //{ // UserId = Guid.NewGuid().ToString("N"), // Email = dto.Email, // UserName = dto.UserName, // AddTime = DateTime.Now //}; _dbContext.Add(info); return _dbContext.SaveChanges(); } /// <summary> /// 編輯用戶信息 /// </summary> /// <param name="dto">實體傳輸對象</param> /// <returns></returns> public int Update(UserDto dto) { var user = _dbContext.TbUsers.Find(dto.UserId); if(user==null) throw new Exception("獲取用戶信息失敗"); //user.UserName = dto.UserName; //user.Email = dto.Email; _mapper.Map(dto, user); return _dbContext.SaveChanges(); } }
運行測試
PS:一般在使用AutoMapper轉換時dto中欄位名稱要跟實體對象定義一樣才能轉換成功。