在.net core中使用AutoMapper進行實體映射

一、什麼是AutoMapper?

AutoMapper是一個簡單的對象映射框架(OOM),將一個對象映射到另一個對象。

二、AutoMapper的好處

以前的時候我們將DTO對象轉換為Model對象時,我們必須將每一個屬性都手動映射

實體類

<code>    /// <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; }
}/<code>

DTO傳輸對象

<code>    /// <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; }
}/<code>

業務層

<code>    /// <summary>
/// 業務處理
/// /<summary>
public class UserService : IUserService
{
private readonly MyDbContext _dbContext;

/// <summary>
/// 構造函數
/// /<summary>
/// <param>
public UserService(MyDbContext dbContext)
{
_dbContext = dbContext;
}
/// <summary>
/// 添加用戶
/// /<summary>
/// <param>實體傳輸對象
/// <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>實體傳輸對象
/// <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();
}
}/<code>

這樣情況還可以,屬性不是很多,如果屬性過多(幾十,幾百),還需要手動賦值,簡直太頭疼了,還會導致大量的時間浪費在對象轉換中,用AutoMapper,只需要簡單的配置就可以完成兩個對象之間的屬性映射,開發中省去了屬性轉換的時間,從而提高工作效率。

三、使用AutoMapper

安裝引用

通過程序包管理器控制檯安裝AutoMapper

Install-Package AutoMapper -version 9.0.0

Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection -version 7.0.0

配置映射關係

創建一個類並繼承autoMapper的Profile類

<code>    public class Mappings : Profile
{
public Mappings()
{
CreateMap<userdto>();
}
}/<userdto>/<code>

注入服務

<code>            //注入AutoMapper服務,Mappings就是自己創建的映射類
services.AddAutoMapper(typeof(Mappings));/<code>

修改業務層代碼

<code>    /// <summary>
/// 業務處理
/// /<summary>
public class UserService : IUserService
{
private readonly MyDbContext _dbContext;
/// <summary>
/// 注入接口
/// /<summary>
private readonly IMapper _mapper;

/// <summary>
/// 構造函數
/// /<summary>
/// <param>
/// <param>
public UserService(MyDbContext dbContext,IMapper mapper)
{
_dbContext = dbContext;
_mapper = mapper;
}
/// <summary>
/// 添加用戶

/// /<summary>
/// <param>實體傳輸對象
/// <returns>
public int Add(UserDto dto)
{
var info = _mapper.Map<userdto>(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>實體傳輸對象
/// <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();
}
}/<userdto>/<code>

運行測試

在.net core中使用AutoMapper進行實體映射

PS:一般在使用AutoMapper轉換時dto中字段名稱要跟實體對象定義一樣才能轉換成功。


分享到:


相關文章: