影片講解(有字幕)
這篇文章要來介紹一個實用的套件AutoMapper,當我們使用Dto時會有以下這種寫法,還不知道Dto做什麼用的可以看這裡(什麼是DTO)。
[HttpGet]
public IEnumerable<TodoListSelectDto> Get()
{
var result = _todoContext.TodoLists
.Select(a => new TodoListSelectDto
{
Enable = a.Enable,
InsertEmployeeName = a.InsertEmployee.Name,
InsertTime = a.InsertTime,
Name = a.Name,
Orders = a.Orders,
TodoId = a.TodoId,
UpdateEmployeeName = a.UpdateEmployee.Name,
UpdateTime = a.UpdateTime
});
return result;
}
可以看到要自行對應相當多的欄位,如果今天欄位少還不覺得怎樣,那欄位一多的話,你就要寫相當多的對應,不僅容易出錯,也相當繁瑣無意義。所以今天我們可以用AutoMapper來幫我們自動實現原始資料跟Dto的轉換。
首先我們要去NuGet套件管理工具下載AutoMapper。
選擇AutoMapper.Extensions.Microsoft.DependencyInjection,這個是for ASP.NET Core的版本。
然後我們要到Startup.cs這邊ConfigureServices裡加上一個設定services.AddAutoMapper(typeof(Startup))
。
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddDbContext<TodoContext>(options => options.UseSqlServer(Configuration.GetConnectionString("TodoDatabase")));
//找個好位置放
services.AddAutoMapper(typeof(Startup));
}
接著我們要建立一個AutoMapper的對應設定檔,我們這邊可以創一個Profiles的資料夾專門來放。
然後建立一個TodoListProfile.cs並繼承Profile<--AutoMapper提供的
namespace Todo.Profiles
{
public class TodoListProfile : Profile
{
public TodoListProfile()
{
CreateMap<TodoList, TodoListDto>();
}
}
}
然後建立以上的程式碼片段CreateMap<TodoList, TodoListDto>();
這邊是要告訴他TodoList跟TodoListDto是有對應關係。
然後我們改一下原來的程式碼。
[HttpGet]
public IEnumerable<TodoListDto> GetAutoMapper()
{
var result = _todoContext.TodoLists;
var map = _mapper.Map<IEnumerable<TodoListDto>>(result);
return map;
}
其中本來要自己去對應Dto我們就先不做對應,直接取出資料表內容var result = _todoContext.TodoLists;
,接著我們再使用AutoMapper幫我們做轉換,var map = _mapper.Map<IEnumerable<TodoListDto>>(result)
,這樣的意思就是說將我們的result轉換成IEnumerable,所以最後的map就會是轉好的格式。接著我們再return map,就大功告成。
如此程式是不是就變的簡潔明瞭了呢~~~所以透過AutoMapper就可以將多行轉換的程式碼,替換成一行就解決了,當然這只是AutoMapper其中的功能之一,往後還會陸續介紹。
以上是今天的簡單教學,想看更多的內容可以看影片。
新手分享學習成果,若有錯誤,煩請告知修正,感謝🙏