目的
快速對應,不需要寫linq來將資料庫端的model對應到view要用的model
建立新專案
選擇ASP.NET Core Web API專案範本,並執行下一步
設定新的專案
命名你的專案名稱,並選擇專案要存放的位置。
其他資訊
直接進行下一步
NuGet加入套件
透過NuGet安裝AutoMapper.Extensions.Microsoft.DependencyInjection
編輯Program.cs檔案
註冊AutoMapper
//找到所有繼承profile
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
新增Mappings資料夾與Models資料夾
在Models資料夾內加入DbModel資料夾與ViewModel資料夾
加入類別檔
在兩個資料夾內加入同名稱的類別檔案
- DbModel.cs寫入程式碼
public int Id { get; set; }
public string? Name { get; set; }
public int Age { get; set; }
public DateTime CreatedDate { get; set; }
可能會有些人問?是什麼,這是因為建立.net6專案預設會開啟判斷值可能為null的警告訊息,可以加上?代表允許此屬性為null,會建議在建構子時提供預設值,來避免嘗試對null值做處理的exception。
- ViewModel.cs寫入程式
public ViewModel() {
Name = string.Empty;
}
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
在建構子提供預設值後,來避免對null做處理。
加入類別檔
在Mappings資料夾內加入名稱為ExampleMapping的類別檔
- 寫入程式 在新增的ExampleMapping.cs檔案內寫入程式碼
using AutoMapper;
using AutoMapperExample.Models.DbModel;
using AutoMapperExample.Models.ViewModel;
namespace AutoMapperExample.Mappings {
//需要繼承AutoMapper的Profile
public class ExampleMapping : Profile {
public ExampleMapping() {
//來源與目標=>白話文是我要將DbModel對應到ViewModel
CreateMap<DbModel, ViewModel>();
}
}
}
加入檔案
在Controllers加入一個空白的API控制器,並命名為ExampleController.cs
- 寫入程式
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using AutoMapperExample.Models.DbModel;
using AutoMapperExample.Models.ViewModel;
using AutoMapper;
namespace AutoMapperExample.Controllers {
[Route("api/[controller]")]
[ApiController]
public class ExampleController : ControllerBase {
private readonly IMapper _mapper;
public ExampleController(IMapper mapper) {
_mapper = mapper;
}
[HttpGet("Index")]
public IEnumerable<ViewModel> Index() {
var DbModel = new List<DbModel>();
//新增DbModel的List模擬從資料庫來的資料
DbModel.Add(new DbModel() { Id = 1, Name = "Bill", Age = 18, CreatedDate = DateTime.Now });
DbModel.Add(new DbModel() { Id = 1, Name = "CI-YU", Age = 20, CreatedDate = DateTime.Now });
DbModel.Add(new DbModel() { Id = 1, Name = "Bill Huang", Age = 22, CreatedDate = DateTime.Now });
//將DbModel資料自動與ViewModel做對應(相同名稱的屬性)
var map = _mapper.Map<IEnumerable<ViewModel>>(DbModel);
return map;
}
}
}
執行結果
可以自動對應到結果了。