ASP.NET Core Web中使用AutoMapper進行對象映射

前言

在日常開發中,我們常常需要將一個對象映射到另一個對象,這個過程中可能需要編寫大量的重複性代碼,如果每次都手動編寫,不僅會影響開發效率,而且當項目越來越複雜、龐大的時候還容易出現錯誤。爲了解決這個問題,對象映射庫就隨之而出了,這些庫可以自動完成對象之間的映射,從而減少大量的開發工作量,提高開發工作效率。今天我們來講講在ASP.NET Core Web中使用AutoMapper快速進行對象映射。

使用對象映射庫有哪些好處?

  • 減少開發工作量,提高開發效率。
  • 減少開發過程中的錯誤和bug。
  • 簡化代碼結構,提高代碼可讀性和可維護性。

AutoMapper對象映射庫介紹

AutoMapper是一個簡單易用的.NET對象映射庫,用於快速、方便地進行對象之間的轉換和映射,極大的簡化了開發人員在處理對象映射時的工作量。

安裝AutoMapper NuGet包

在ASP.NET Core Web API項目中搜索:AutoMapper NuGet包安裝。

創建源對象和目標對象

接下來我們分別定義一個源對象(Student)和一個目標對象(StudentViewModel)。

Student(源對象)

    public class Student
    {
        /// <summary>
        /// 學生ID [主鍵,自動遞增]
        /// </summary>
        [PrimaryKey, AutoIncrement]
        [Display(Name = "學生ID")]
        public int StudentID { get; set; }

        /// <summary>
        /// 班級ID
        /// </summary>
        [Display(Name = "班級ID")]
        public int ClassID { get; set; }

        /// <summary>
        /// 學生姓名
        /// </summary>
        [Display(Name = "學生姓名")]
        public string Name { get; set; }

        /// <summary>
        /// 學生年齡
        /// </summary>
        [Display(Name = "學生年齡")]
        public int Age { get; set; }

        /// <summary>
        /// 學生性別
        /// </summary>
        [Display(Name = "學生性別")]
        public string Gender { get; set; }
    }

StudentViewModel(目標對象)

    public class StudentViewModel
    {
        /// <summary>
        /// 學生ID [主鍵,自動遞增]
        /// </summary>
        [PrimaryKey, AutoIncrement]
        [Display(Name = "學生ID")]
        public int StudentID { get; set; }

        /// <summary>
        /// 班級ID
        /// </summary>
        [Display(Name = "班級ID")]
        public int ClassID { get; set; }

        /// <summary>
        /// 學生姓名
        /// </summary>
        [Display(Name = "學生姓名")]
        public string Name { get; set; }

        /// <summary>
        /// 學生年齡
        /// </summary>
        [Display(Name = "學生年齡")]
        public int Age { get; set; }

        /// <summary>
        /// 學生性別
        /// </summary>
        [Display(Name = "學生性別")]
        public string Gender { get; set; }

        /// <summary>
        /// 班級名稱
        /// </summary>
        [Display(Name = "班級名稱")]
        public string ClassName { get; set; }
    }

配置AutoMapper映射規則

我們可以定義一個AutoMapperMappingProfile的映射配置文件,並在其中定義源類型和目標類型之間的映射關係。

using AutoMapper;
using Entity;
using Entity.ViewModel;

namespace WebApi
{
    /// <summary>
    /// AutoMapper映射配置文件
    /// </summary>
    public class AutoMapperMappingProfile : Profile
    {
        /// <summary>
        /// 添加映射規則
        /// </summary>
        public AutoMapperMappingProfile()
        {
            CreateMap<Student, StudentViewModel>();
        }
    }
}

Program中註冊AutoMapper服務

使用AddAutoMapper()方法可以將AutoMapper所需的服務添加到該集合中,以便在應用程序的其他部分中使用。該方法需要傳入一個Assembly數組,以告訴AutoMapper要掃描哪些程序集來查找映射配置(在當前作用域的所有程序集裏面掃描AutoMapper的配置文件)。

        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            builder.Services.AddControllers();

            //添加 AutoMapper 的配置
            //使用AddAutoMapper()方法可以將AutoMapper所需的服務添加到該集合中,以便在應用程序的其他部分中使用。
            //該方法需要傳入一個Assembly數組,以告訴AutoMapper要掃描哪些程序集來查找映射配置(在當前作用域的所有程序集裏面掃描AutoMapper的配置文件)。
            builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());

        }

進行對象映射操作

依賴注入獲取IMapper接口的實例

    /// <summary>
    /// 學生管理
    /// </summary>
    [ApiController]
    [Route("api/[controller]/[action]")]
    public class StudentController : ControllerBase
    {
        private readonly IMapper _mapper;

        /// <summary>
        /// 依賴注入
        /// </summary>
        /// <param name="mapper">mapper</param>
        public StudentController(IMapper mapper)
        {
            _mapper = mapper;
        }
    }

進行對象映射操作

接下來我們使用使用IMapper接口的Map方法來進行對象映射操作。

var studentsListDto = _mapper.Map<List<StudentViewModel>>(students);

映射結果輸出

完整示例源代碼

DotNetGuide技術社區交流羣

  • DotNetGuide技術社區是一個面向.NET開發者的開源技術社區,旨在爲開發者們提供全面的C#/.NET/.NET Core相關學習資料、技術分享和諮詢、項目框架推薦、求職和招聘資訊、以及解決問題的平臺。
  • 在DotNetGuide技術社區中,開發者們可以分享自己的技術文章、項目經驗、學習心得、遇到的疑難技術問題以及解決方案,並且還有機會結識志同道合的開發者。
  • 我們致力於構建一個積極向上、和諧友善的.NET技術交流平臺。無論您是初學者還是有豐富經驗的開發者,我們都希望能爲您提供更多的價值和成長機會。

歡迎加入DotNetGuide技術社區微信交流羣👨‍👩‍👦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章