最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何在?.NET?9?中使用?Mapster?快速、高效的實(shí)現(xiàn)對(duì)象映射

 更新時(shí)間:2025年10月22日 08:48:56   作者:追逐時(shí)光者  
本文我們的主要內(nèi)容就是講解如何在ASP.NET?Core?9.0?Web?API項(xiàng)目中使用Mapster快速、高效的實(shí)現(xiàn)對(duì)象映射,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧

前言

在日常開發(fā)中,我們常常需要將一個(gè)對(duì)象映射到另一個(gè)對(duì)象,比如將數(shù)據(jù)庫(kù)實(shí)體轉(zhuǎn)換為數(shù)據(jù)傳輸對(duì)象(DTO),或?qū)⒄?qǐng)求模型映射為領(lǐng)域模型。這個(gè)過(guò)程通常涉及大量重復(fù)性代碼,如果每次都手動(dòng)編寫,不僅嚴(yán)重影響開發(fā)效率,而且隨著項(xiàng)目規(guī)模不斷增長(zhǎng),還容易出現(xiàn)錯(cuò)誤(如:屬性遺漏、手寫時(shí)寫錯(cuò)或復(fù)制粘貼失誤等)。

本文我們的主要內(nèi)容就是講解如何在 ASP.NET Core 9.0 Web API 項(xiàng)目中使用 Mapster 快速、高效的實(shí)現(xiàn)對(duì)象映射。

Mapster 介紹

Mapster 是一個(gè)開源免費(fèi)(MIT license)、快速、高性能、靈活且易于使用的 .NET 對(duì)象映射庫(kù),用于在 .NET 用程序中進(jìn)行對(duì)象之間的轉(zhuǎn)換和映射操作,大幅減少手動(dòng)賦值帶來(lái)的重復(fù)代碼、人為錯(cuò)誤和維護(hù)成本。

安裝 Mapster 相關(guān)包

方式一、NuGet 包管理器安裝

在 NuGet 包管理器中搜索:Mapster 和 Mapster.DependencyInjection 安裝:

Mapster 核心功能包

Mapster.DependencyInjection 依賴注入集成包

方式二、.NET CLI 安裝

dotnet add package Mapster --version 7.4.0 #核心功能包
dotnet add package Mapster.DependencyInjection --version 1.0.1 #依賴注入集成包

在 Program.cs 中注冊(cè) Mapster 服務(wù)

var builder = WebApplication.CreateBuilder(args);
// 注冊(cè) Mapster 服務(wù)
builder.Services.AddMapster();
// 注冊(cè) Mapster 映射規(guī)則
MapsterConfig.Register();

基礎(chǔ)映射一行代碼搞定

接下來(lái)我們分別定義一個(gè)源對(duì)象(Student)和一個(gè)目標(biāo)對(duì)象(StudentViewModel),它們的屬性名和類型完全一致。

Student(源對(duì)象)    

public classStudent
    {
        /// <summary>
        /// 學(xué)生ID [主鍵,自動(dòng)遞增]
        /// </summary>
        [PrimaryKey, AutoIncrement]
        [Display(Name = "學(xué)生ID")]
        publicint StudentID { get; set; }
        /// <summary>
        /// 班級(jí)ID
        /// </summary>
        [Display(Name = "班級(jí)ID")]
        publicint ClassID { get; set; }
        /// <summary>
        /// 學(xué)生姓名
        /// </summary>
        [Display(Name = "學(xué)生姓名")]
        publicstring Name { get; set; }
        /// <summary>
        /// 學(xué)生年齡
        /// </summary>
        [Display(Name = "學(xué)生年齡")]
        publicint Age { get; set; }
        /// <summary>
        /// 學(xué)生性別
        /// </summary>
        [Display(Name = "學(xué)生性別")]
        publicstring Gender { get; set; }
    }

StudentViewModel(目標(biāo)對(duì)象)    

public classStudentViewModel
    {
        /// <summary>
        /// 學(xué)生ID
        /// </summary>
        [PrimaryKey, AutoIncrement]
        [Display(Name = "學(xué)生ID")]
        publicint StudentID { get; set; }
        /// <summary>
        /// 班級(jí)ID
        /// </summary>
        [Display(Name = "班級(jí)ID")]
        publicint ClassID { get; set; }
        /// <summary>
        /// 學(xué)生姓名
        /// </summary>
        [Display(Name = "學(xué)生姓名")]
        publicstring Name { get; set; }
        /// <summary>
        /// 學(xué)生年齡
        /// </summary>
        [Display(Name = "學(xué)生年齡")]
        publicint Age { get; set; }
        /// <summary>
        /// 學(xué)生性別
        /// </summary>
        [Display(Name = "學(xué)生性別")]
        publicstring Gender { get; set; }
        /// <summary>
        /// 班級(jí)名稱
        /// </summary>
        [Display(Name = "班級(jí)名稱")]
        publicstring ClassName { get; set; }
    }

Mapster 自動(dòng)完成映射

只要屬性名和類型一致,Mapster 自動(dòng)完成映射,無(wú)需任何配置!        

private async Task<List<StudentViewModel>?> GetStudentClassInfo(List<Student> students)
        {
            // Mapster 映射(無(wú)需任何配置?。?
            var studentsListDto = students.Adapt<List<StudentViewModel>>();
            if (studentsListDto?.Count > 0)
            {
                var classIDs = studentsListDto.Select(x => x.ClassID).Distinct().ToList();
                var querySchoolClassList = await _schoolClassHelper.QueryAsync(x => classIDs.Contains(x.ClassID)).ConfigureAwait(false);
                if (querySchoolClassList?.Count > 0)
                {
                    foreach (var studentItem in studentsListDto)
                    {
                        var getClassInfo = querySchoolClassList.FirstOrDefault(x => x.ClassID == studentItem.ClassID);
                        if (getClassInfo != null)
                        {
                            studentItem.ClassName = getClassInfo.ClassName;
                        }
                    }
                }
            }
            return studentsListDto;
        }

映射結(jié)果輸出:

自定義映射規(guī)則

當(dāng)屬性名或類型不一致時(shí),可通過(guò)配置指定映射邏輯。

UserInfo(源對(duì)象)

public classUserInfo
    {
        publicint Id { get; set; }
        publicstring FirstName { get; set; }
        publicstring LastName { get; set; }
        publicstring Email { get; set; }
        public DateTime CreatedAt { get; set; }
    }

UserInfoViewModel(目標(biāo)對(duì)象)    

public classUserInfoViewModel
    {
        publicint Id { get; set; }
        /// <summary>
        /// 合并 FirstName + LastName
        /// </summary>
        publicstring FullName { get; set; }
        publicstring Email { get; set; }
        /// <summary>
        /// 格式化日期
        /// </summary>
        publicstring CreatedDate { get; set; }
    }

配置 Mapster 映射規(guī)則

在項(xiàng)目根目錄創(chuàng)建 MapsterConfig.cs    

/// <summary>
    /// Mapster 全局映射配置類。
    /// 用于集中注冊(cè)項(xiàng)目中所有自定義的對(duì)象映射規(guī)則,
    /// 避免映射邏輯分散在各處,提升可維護(hù)性與可測(cè)試性。
    /// </summary>
    publicstaticclassMapsterConfig
    {
        /// <summary>
        /// 注冊(cè)所有自定義的 Mapster 映射配置
        /// 此方法應(yīng)在應(yīng)用程序啟動(dòng)時(shí)(如 Program.cs)調(diào)用一次
        /// </summary>
        public static void Register()
        {
            TypeAdapterConfig<UserInfo, UserInfoViewModel>
                .NewConfig()
                .Map(dest => dest.FullName,
                     src => $"{src.FirstName} {src.LastName}".Trim())
                .Map(dest => dest.CreatedDate,
                     src => src.CreatedAt.ToString("yyyy-MM-dd"));
        }
    }

自定義映射規(guī)則    

/// <summary>
    /// 使用 Mapster 映射 UserInfo 示例
    /// </summary>
    [ApiController]
    [Route("api/[controller]/[action]")]
    publicclassUserInfoController : ControllerBase
    {
        privatereadonly IMapper _mapper;
        /// <summary>
        /// 依賴注入
        /// </summary>
        /// <param name="mapper">mapper</param>
        public UserInfoController(IMapper mapper)
        {
            _mapper = mapper;
        }
        /// <summary>
        /// GetUserInfo
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public List<UserInfoViewModel> GetUserInfos()
        {
            var userInfos = new List<UserInfo>
            {
                new UserInfo
                {
                    Id = 999,
                    FirstName = "李",
                    LastName = "四",
                    Email = "lisi@qq.com",
                    CreatedAt = DateTime.Now.AddYears(-5)
                },
                new UserInfo
                {
                    Id = 666,
                    FirstName = "張",
                    LastName = "三",
                    Email = "zhangsan@example.com",
                    CreatedAt = DateTime.UtcNow.AddDays(-10)
                }
            };
            // 使用 Mapster 映射
            var getUserInfoViewModels = _mapper.Map<List<UserInfoViewModel>>(userInfos);
            return getUserInfoViewModels;
        }
    }

映射結(jié)果輸出:

完整示例源代碼

到此這篇關(guān)于在 .NET 9 中使用 Mapster 快速、高效的實(shí)現(xiàn)對(duì)象映射的文章就介紹到這了,更多相關(guān).net  mapster 對(duì)象映射內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

乌拉特前旗| 茌平县| 长沙县| 长岭县| 信阳市| 黎川县| 区。| 新余市| 湛江市| 共和县| 通榆县| 吴江市| 沙洋县| 平南县| 子长县| 普陀区| 佳木斯市| 栾川县| 巴楚县| 久治县| 昭通市| 岐山县| 和林格尔县| 天祝| 都安| 裕民县| 会泽县| 峡江县| 阳曲县| 晴隆县| 昭平县| 多伦县| 鹤庆县| 应城市| 同仁县| 东台市| 饶平县| 屏东县| 永嘉县| 揭东县| 三台县|