1 什么是AutoMapper?
AutoMapper是一個對象-對象映射器。對象-對象映射通過將一種類型的輸入對象轉換為另一種類型的輸出對象來工作。使AutoMapper變得有趣的是,它提供了一些有趣的約定,以免去弄清楚如何將類型A映射為類型B。只要類型B遵循AutoMapper既定的約定,就需要幾乎零配置來映射兩個類型。
2 為什么要使用AutoMapper?
映射代碼很無聊。測試映射代碼更加無聊。AutoMapper提供了簡單的類型配置以及簡單的映射測試。真正的問題可能是“為什么使用對象-對象映射?” 映射可以在應用程序的許多地方發生,但主要發生在層之間的邊界中,例如,UI/域層或服務/域層之間。一層的關注點通常與另一層的關注點沖突,因此對象-對象映射導致分離的模型,其中每一層的關注點僅會影響該層中的類型。
3 如何使用AutoMapper?
首先,將AutoMapper,AutoMapper.Extensions.Microsoft.DependencyInjection的NuGet軟件包安裝到您的應用程序中。
dotnet add package AutoMapper
dotnet add package AutoMapper.Extensions.Microsoft.DependencyInjection
然后,創建DomainToDTOProfile,Todo,TodoDTO類
namespace AutoMapper.WebApi01
{
public class DomainToDTOProfile : Profile
{
public DomainToDTOProfile()
{
CreateMap<Todo, TodoDTO>();
}
}
}
public class Todo
{
#region Public Properties
public Guid Id { get; set; }
public string Name { get; set; }
#endregion
}
public class TodoDTO
{
#region Public Properties
public Guid Id { get; set; }
public string Name { get; set; }
#endregion
}
接着,在Startup.ConfigureServices中增加services.AddAutoMapper;
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "Autofac.WebApi", Version = "v1" });
});
services.AddAutoMapper(typeof(DomainToDTOProfile));
}
最后,增加HomeController,創建Todo對象,然后將Todo對象映射給TodoDTO
using Microsoft.AspNetCore.Mvc;
using System;
namespace AutoMapper.WebApi01.Controllers
{
[Route("[controller]")]
[ApiController]
public class HomeController : Controller
{
private readonly IMapper mapper; // <-添加此行
public HomeController(IMapper mapper)
{
this.mapper = mapper ?? throw new ArgumentNullException(nameof(mapper));
}
[HttpGet]
public TodoDTO Get()
{
var todo = new Todo
{
Id = new Guid("9a007349-23fa-45da-97a1-2999f923b5a7"),
Name = "小明",
};
var todoDTO = mapper.Map<TodoDTO>(todo);
return todoDTO;
}
}
}
讓我們來看看輸出結果:
{
"id": "9a007349-23fa-45da-97a1-2999f923b5a7",
"name": "小明"
}
