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

jason發表於2020-08-27

1:什麼是AutoMapper?

下面為AutoMapper官方的解釋:

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

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

附上官網地址:https://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實體

Asp.NetCore 3.1 使用AutoMapper自動對映轉換實體 DTO,Data2ViewModel
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
Asp.NetCore 3.1 使用AutoMapper自動對映轉換實體 DTO,Data2ViewModel
 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:在Core WebApi中使用AutoMapper

Asp.NetCore 3.1 使用AutoMapper自動對映轉換實體 DTO,Data2ViewModel
 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:最後還不過癮,再來一波小菜:下面只是起到拋磚引玉的作用, 學友們可以根據自己的實際情況來使用擴充套件方法,直接點出,更是美美噠!!!

 

相關文章