.net core 中使用AutoMapper映射 簡單易懂


一、為什么使用AutoMapper

AutoMapper的功效其實就是把一個對象里面的value 映射 也就是復制到另一個對象,

比如我們有一個接口用來接收第三方數據的,接收了一個對象里面有很多字段,但是呢,

在我們需要保存到數據庫的時候,字段名稱不一樣甚至有一些連類型都不一樣

這就需要我們自己的model類與傳遞過來的model類進行映射,A.name =B.Name ,A.sex = B.gender 這樣的代碼就會增多

而且如果改動某一個字段或者刪除某一個字段,那么就要把代碼中這樣的代碼全部處理,灰常不方便,於是乎,我們選擇了AutoMapper來映射

好處就是,名字相同的我們不需要處理,字段數量不對等也不會報錯,代碼整潔 不會左一塊右一快。

接下來我們要在項目中使用AutoMapper來處理對象之間的映射。

在model層新建一個文件夾起名叫ViewModel 然后在下面 新建一個UserViewModel 實體類 代碼如下

using System;
using System.Collections.Generic;
using System.Text;

namespace WebApi.Core.Model.ViewModel
{
    /// <summary>
    /// User數據的展示實體
    /// </summary>
    public class UserViewModel
    {
        /// <summary>
        /// ID
        /// </summary>
        public int UserId { get; set; }

        /// <summary>
        /// 用戶名
        /// </summary>
        public string UserName { get; set; }

        /// <summary>
        /// 年齡
        /// </summary>
        public int? Age { get; set; }

        /// <summary>
        /// 生日
        /// </summary>
        public string Birthday { get; set; }


        /// <summary>
        /// 手機
        /// </summary>
        public string Phone { get; set; }

        /// <summary>
        /// 地址
        /// </summary>

        public string Address { get; set; }
    }
}

Service層中引用Nuget包 AutoMapper 和AutoMapper.Extensions.Microsoft.DependencyInjection

 

 

 在Api層添加AutoMapper文件夾,然后添加映射配置文件CustomProfile.cs 用來匹配所有的映射對象關系

 

 

 代碼如下

using AutoMapper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using WebApi.Core.Model;
using WebApi.Core.Model.ViewModel;

namespace WebApi.Core.Api.AutoMapper
{
    public class CustomProfile:Profile
    {
        /// <summary>
        /// 配置構造函數,用來創建關系映射
        /// </summary>
        public CustomProfile()
        {
            CreateMap<UsersModel, UserViewModel>();
        }
    }
}

注入服務  找到Startup.cs 在ConfiguService中 添加AutoMapper

(注意啊老鐵們,這里有個大坑啊,這個服務的注冊順序很重要啊,很重要,很重要,在本地運行沒問題,

放到linux環境,哐哐的報錯,找了一整天啊,記得放在最上面,ps:目前我放在最上面程序可以啟動了,至於對不對。。。)

這就算完成了AutoMapper的服務注入,接下來我們研究一下怎么用

首先在IUserService 添加一個方法GetUserDetails,代碼如下

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using WebApi.Core.IService.Base;
using WebApi.Core.Model;
using WebApi.Core.Model.ViewModel;

namespace WebApi.Core.IService
{
    public interface IUserService:IBaseService<UsersModel>
    {
        /// <summary>
        /// 測試sqlSugar 常用語句
        /// </summary>
        void testSqlSugar();
        /// <summary>
        /// 獲取用戶詳情數據
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        Task<UserViewModel> GetUserDetails(int id);
    }
}

在UserService中實例這個方法,代碼如下

using AutoMapper;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using WebApi.Core.IRepository;
using WebApi.Core.IRepository.Base;
using WebApi.Core.IService;
using WebApi.Core.Model;
using WebApi.Core.Model.ViewModel;
using WebApi.Core.Service.Base;

namespace WebApi.Core.Service
{
    public class UserService:BaseService<UsersModel>,IUserService
    {
        //聲明常量
        private readonly IUserRepository userService;
        private readonly IMapper iMapper;
        public UserService(IBaseRepository<UsersModel> baseRepository, IUserRepository usersSer,IMapper mapper):base(baseRepository)
        {
            userService = usersSer;
            iMapper = mapper;
        }
        /// <summary>
        /// 測試sqlSugar 常用語句
        /// </summary>
        public void testSqlSugar()
        {
            userService.testSqlSugar();
        }
        /// <summary>
        /// 獲取用戶詳情數據
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public async Task<UserViewModel> GetUserDetails(int id)
        {
            var userInfo = await userService.QueryByID(id);
            if (userInfo != null)
            {
                UserViewModel model = iMapper.Map<UserViewModel>(userInfo);

                return model;
            }
            else
            {
                return null;
            }
        }
    }
}

然后在UserORMController 加一個測試接口 代碼如下

 /// <summary>
        /// 測試automapper
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<IActionResult> AutoMapper(int id)
        {
            var userinfo = await userService.GetUserDetails(id);

            return Ok(userinfo);
        }

F5啟動調試一下 看看結果,這就是AutoMapper了,當你的實體類越來越多 業務也越來越復雜的時候,就能體現出這種映射的好處了

 

這里注意一下  這個是單向映射的,不是雙向哦,也就是說 UserModel,映射到UserViewModel 可以。。

反過來 把UserViewModel映射到UserModel里面是不行的,需要在加一個 CreateMap<UserViewModel,UserModel>

接下來我們在測試一下,名稱不一樣,在加上子類,在反向處理,獲取一個json然后存入到數據庫

首先新建一個文件夾取名字叫Entity 然后創建一個BaseEntity 類,在創建一個測試model類TestAutoMapper

 

 代碼 如下

using System;
using System.Collections.Generic;
using System.Text;

namespace WebApi.Core.Model.Entity
{
    public class BaseEntity
    {
        public int page { get; set; }
        public int size { get; set; }
    }
}
using System;
using System.Collections.Generic;
using System.Text;
using WebApi.Core.Model.Entity;

namespace WebApi.Core.Model
{
    public class TestAutoMapper:BaseEntity
    {
        /// <summary>
        /// 對應UserId
        /// </summary>
        public int id { get; set; }
        /// <summary>
        /// 姓名
        /// </summary>
        public string UserName { get; set; }
        /// <summary>
        /// 對應Age
        /// </summary>
        public int yearDate { get; set; }
        /// <summary>
        /// 存一個list 存放 子表
        /// </summary>
        public List<TokenModel> tokenList { get; set; }
    }
}

然后在IUserService 和UserService 添加方法,代碼如下

/// <summary>
        /// 獲取數據插入到數據庫 放到IUserService里面
        /// </summary>
        /// <param name="userviewmodel"></param>
        /// <returns></returns>
        Task<bool> AddUserByViewModel(TestAutoMapper testmodel);
/// <summary>
        /// 獲取數據插入到數據庫  放到UserService里面
        /// </summary>
        /// <param name="userviewmodel"></param>
        /// <returns></returns>
        public async Task<bool> AddUserByViewModel(TestAutoMapper testmodel)
        {
            if (testmodel != null)
            {
                UsersModel userinfo = iMapper.Map<UsersModel>(testmodel);
                return await userService.Add(userinfo);
            }
            else
            {
                return false;
            }
        }

最后在配置一下AutoMapper映射   在Api 的 CustomProfile.cs 里面代碼如下

using AutoMapper;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using WebApi.Core.Model;
using WebApi.Core.Model.ViewModel;

namespace WebApi.Core.Api.AutoMapper
{
    public class CustomProfile:Profile
    {
        /// <summary>
        /// 配置構造函數,用來創建關系映射
        /// </summary>
        public CustomProfile()
        {
            CreateMap<UsersModel, UserViewModel>()
                .ForMember(d=>d.Phone,o=>o.MapFrom(s=>s.Age));
      
            CreateMap<TestAutoMapper, UsersModel>()  
                .ForMember(d=>d.UserId,o=>o.MapFrom(s=>s.id))
                .ForMember(d=>d.Age,o=>o.MapFrom(s=>s.yearDate))
                .ForMember(d=>d.UserName,o=>o.MapFrom(s=>JsonConvert.SerializeObject(s.tokenList)));
        }
    }
}

在UserORMController里面添加接口測試

/// <summary>
        /// 測試AutoMapper反向映射,插入到數據庫
        /// </summary>
        /// <param name="testmodel"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IActionResult> AutoMapperReverse(TestAutoMapper testmodel)
        {
            var result = await userService.AddUserByViewModel(testmodel);

            return Ok(result);
        }

我們按F5 調試一下,可以看到已經成功了,其實很簡單,就是把一個對象的值,復制到另一個對象中,其中的值可以隨意轉變,靈活控制

 

數據也成功的插入進去了,不管是繼承了什么子類 只要是名字一樣的autoMapper 都會找到 然后映射過去,如果不想那么做,就單獨映射那個字段

 

 這個AutoMapper 今天就到這兒了,使用應該已經沒什么困難了,后期再補充一些底層的東西,怎么映射的,如何實現的等等。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM