Asp.NetCore 3.1 使用AutoMapper自動映射轉換實體 DTO,Data2ViewModel

1:什麼是AutoMapper?

下面為AutoMapper官方的解釋:

AutoMapper是一個對象-對象映射器。對象-對象映射通過將一種類型的輸入對象轉換為另一種類型的輸出對象來工作。

使AutoMapper變得有趣的是,它提供了一些有趣的約定,以免去搞清楚如何將類型A映射為類型B。只要類型B遵循AutoMapper既定的約定,就需要幾乎零配置來映射兩個類型。

附上官網地址://docs.automapper.org/en/stable/Getting-started.html

2:使用AutoMapper有啥好處?

其實,這個比較好回答,通常在我們使用面向對象編程中,經常會遇到,ORM從資料庫表中獲取到比較多的欄位,

這個時候我們止血藥在頁面展示比較少的欄位,也可以起到節省流量,如果一兩個實體的轉換還好,成白上千N多地方都需要這樣的操作,

還是手動一個一個的賦值實就大大降低了開發效率,這個時候AutoMapper就派上了用場!

3:怎麼使用AutoMapper?

1:引入NuGet包 AutoMapper.Extensions.Microsoft.DependencyInjection 8.0.1最新版本即可,其他相關的依賴包會自動導入新增進來

2:定義好相關的model實體

using System;

namespace WebApp.AutoMapperTestModel
{
    // Entity類
    public class SendMsg
    {
        public int mid { get; set; }
        public string mTitle { get; set; }
        public string mContent { get; set; }
        public DateTime editTime { get; set; }
    }
}

View Code

 1 using System;
 2 
 3 namespace WebApp.AutoMapperTestModel
 4 {
 5     public class SendMsgViewModel
 6     {
 7         public int mid { get; set; }
 8         public string mTitlw { get; set; }
 9         public string mContent { get; set; }
10         public DateTime UpdateTime { get; set; }
11     }
12 }

View Code

3:注入AutoMapper的服務

 4:使用AutoMapper創建實體之間的關係,定義一個來繼承 Profile

5:在WebApi中較大使用AutoMapper

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Threading.Tasks;
 5 
 6 namespace WebApp.Controllers
 7 {
 8     using WebApp.AutoMapperTestModel;
 9     using AutoMapper;
10     using Microsoft.AspNetCore.Mvc;
11     [ApiController]
12     [Route("api/[Controller]")]
13     public class DoAutoMapperController
14     {
15         private IMapper _mapper;
16         private List<SendMsg> sendMsgList { get; set; }
17         private SendMsg sendMsgOne { get; set; }
18 
19         public DoAutoMapperController(IMapper mapper)
20         {
21             _mapper = mapper;
22             sendMsgList = GetList();
23             sendMsgOne = GetSendMsg();
24 
25         }
26         private List<SendMsg> GetList()
27         {
28             return new List<SendMsg> {
29                  new SendMsg{ mid=110,editTime=DateTime.Parse("1998-01-01"),mContent="你好我好大家好1",mTitle="T1"},
30                  new SendMsg{ mid=111,editTime=DateTime.Parse("1998-02-01"),mContent="你好我好大家好2",mTitle="T2"},
31                  new SendMsg{ mid=112,editTime=DateTime.Parse("1998-03-01"),mContent="你好我好大家好3",mTitle="T3"},
32                  new SendMsg{ mid=113,editTime=DateTime.Parse("1998-04-01"),mContent="你好我好大家好4",mTitle="T4"},
33                  new SendMsg{ mid=114,editTime=DateTime.Parse("1998-05-01"),mContent="你好我好大家好5",mTitle="T5"}
34             };
35         }
36         private SendMsg GetSendMsg()
37         {
38             return new SendMsg { mid = 110, editTime = DateTime.Parse("1998-01-01"), mContent = "你好我好大家好1", mTitle = "T1" };
39         }
40 
41         [HttpGet("Automapper")]
42         public ApiResultObject AutomapperOne()
43         {
44             ApiResultObject resultObject = new ApiResultObject();
45             try
46             {
47                 var sendmsg = _mapper.Map<SendMsg, SendMsgViewModel>(sendMsgOne);
48                 if (sendmsg != null)
49                 {
50                     resultObject.Data = sendmsg;
51                     resultObject.Code = ResultCode.Success;
52                     resultObject.Msg = "AutoMapper Success";
53                 }
54                 else
55                 {
56                     resultObject.Data = Enumerable.Empty<SendMsgViewModel>();
57                 }
58             }
59             catch (Exception ex)
60             {
61                 resultObject.Msg = $"發生異常:{ ex.Message}";
62             }
63             return resultObject;
64 
65         }
66         [HttpGet("AutomapperList")]
67         public ApiResultObject AutomapperList()
68         {
69             ApiResultObject resultObject = new ApiResultObject();
70             try
71             {
72                 //                                                                      List IEnumerable
73                 IEnumerable<SendMsgViewModel> sendMsgViewModels = _mapper.Map<List<SendMsg>, IEnumerable<SendMsgViewModel>>(sendMsgList);
74                 if (sendMsgViewModels != null && sendMsgViewModels.Any())
75                 {
76                     resultObject.Data = sendMsgViewModels;
77                     resultObject.Code = ResultCode.Success;
78                     resultObject.Msg = "AutoMapper Success";
79                 }
80                 else
81                 {
82                     resultObject.Data = Enumerable.Empty<SendMsgViewModel>();
83                 }
84             }
85             catch (Exception ex)
86             {
87                 resultObject.Msg = $"發生異常:{ ex.Message}";
88             }
89             return resultObject;
90         }
91     }
92 }

View Code

6:看測試結果:

兩個表的定義的字存在不一致,映射的時候也沒有指明關係,會導致相關欄位沒有值

映射並指明兩者之間的屬性關係之後:

 最後來一個集合的映射測試,測試結果是ok的

7:最後還不過癮,再來一波小菜:下面只是起到拋磚引玉的作用, 學友們可以根據自己的實際情況來使用擴展方法,直接點出,更是美美噠!!!