.NET CORE 中使用AutoMapper進行物件對映

木子iiiii發表於2018-07-12

概述

在網際網路產品中,前臺頁面可謂是變化莫測,今天是這個樣,明兒是那個樣。而Dto可以面向UI層,頁面不管怎麼變,Dto總是那麼靈活而不影響我們的服務端的主體業務,而我們的Model就更專注業務。
這樣一來,通過Dto我們實現了表現層與Model之間的解耦,表現層不引用Model層的東西。

在ASP.NET CORE中,我們可以使用AutoMapper來實現物件資料傳輸也就是Dto。

1、需要安裝如下兩個包,通過Nuget安裝即可:

AutoMapper       
AutoMapper.Extensions.Microsoft.DependencyInjection  //需要依賴注入AutoMapper,需要下載該包。

2、在Startup中新增AutoMapper:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    //新增對AutoMapper的支援
    services.AddAutoMapper();
}

3、建立AutoMapper對映規則,得告訴AutoMapper對映關係:

public class AutoMapperConfigs: Profile
{
        //新增你的實體對映關係.
        public AutoMapperConfigs()
        {
            //GoodsEntity轉GoodsDto.
            CreateMap<GoodsEntity, GoodsDto>()
                //對映發生之前
                .BeforeMap((source,dto) => {
                    //可以較為精確的控制輸出資料格式
                    dto.CreateTime = Convert.ToDateTime(source.CreateTime).ToString("yyyy-MM-dd");
                })
                //對映發生之後
                .AfterMap((source, dto) => {
                    //code ...
                });

            //GoodsDto轉GoodsEntity.
            CreateMap<GoodsDto, GoodsEntity>();
        }
}

4、大膽的使用AutoMapper吧,在你的Controller建構函式中注入你的IMapper:

[Produces("application/json")]
[Route("api/Goods")]
public class GoodsController : Controller
{
     private readonly IMapper _mapper;
     public GoodsController(IMapper mapper)
     {
         _mapper = mapper;
     }
}

5、單個物件轉Dto:

[HttpGet]
[Route(nameof(GetGoods))]
 public async Task<GoodsDto> GetGoods()
 {
     //模擬資料
     var goods = new GoodsEntity() { Id = 1, Name = "商品1", Price = 23.25M };
     //單個實體物件轉單個Dto物件.
     var goodsDto = _mapper.Map<GoodsDto>(goods);
     return goodsDto;
 }

6、集合轉Dto集合:

[HttpGet]
[Route(nameof(GetGoodsList))]
   public async Task<List<GoodsDto>> GetGoodsList()
   {
       //模擬資料
       var goodsList = new List<GoodsEntity>()
       {
           new GoodsEntity(){ Id=1,Name="商品1",Price=23.25M,CreateTime=DateTime.Now },
           new GoodsEntity(){ Id=2,Name="商品2",Price=21.25M,CreateTime=DateTime.Now },
           new GoodsEntity(){ Id=3,Name="商品3",Price=20.25M,CreateTime=DateTime.Now },
           new GoodsEntity(){ Id=4,Name="商品4",Price=19.25M,CreateTime=DateTime.Now },
       };
       //物件集合轉Dto集合.
       var goodsDtos = _mapper.Map<List<GoodsDto>>(goodsList);
       return goodsDtos;
   }
注意

AutoMapper功能很強大,我所介紹的只是其冰川一角,有興趣的夥伴可以去AutoMapper官方文件深入學習。
如果有小夥伴覺得在使用AutoMapper都得在Controller的建構函式中進行注入一遍麻煩的話,AutoMapper也是支援這種對映方式如:Mapper.Map

歡迎加入.NET CORE/ASP.NET CORE 技術交流群,我們期待你的加入。
群號:702566187

相關文章