自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

聊一下對象到對象映射之AutoMapper

開發(fā) 前端
AutoMapper 是一個(gè)對象-對象映射器,可以將一個(gè)對象映射到另一個(gè)對象。用來解決一個(gè)看似復(fù)雜的問題,這種類型的代碼編寫起來相當(dāng)枯燥乏味.

 [[402479]]

本文轉(zhuǎn)載自微信公眾號「UP技術(shù)控」,作者conan5566。轉(zhuǎn)載本文請聯(lián)系UP技術(shù)控公眾號。

概述

AutoMapper 是一個(gè)對象-對象映射器,可以將一個(gè)對象映射到另一個(gè)對象。

用來解決一個(gè)看似復(fù)雜的問題,這種類型的代碼編寫起來相當(dāng)枯燥乏味,

官網(wǎng)地址:http://automapper.org/

官方文檔:https://docs.automapper.org/en/latest/

入門

AutoMapper支持使用靜態(tài)服務(wù)位置構(gòu)造“自定義值解析器”,“自定義類型轉(zhuǎn)換器”和“值轉(zhuǎn)換器”的功能:

  1. var configuration = new MapperConfiguration(cfg => 
  2.     cfg.ConstructServicesUsing(ObjectFactory.GetInstance); 
  3.  
  4.     cfg.CreateMap<Source, Destination>(); 
  5. }); 

或動(dòng)態(tài)服務(wù)位置,用于基于實(shí)例的容器(包括子容器/嵌套容器):

  1. var mapper = new Mapper(configuration, childContainer.GetInstance); 
  2.  
  3. var dest = mapper.Map(new Source { Value = 15 }); 

您可以使用配置文件定義配置。然后,通過在啟動(dòng)時(shí)調(diào)用IServiceCollection擴(kuò)展方法AddAutoMapper,使AutoMapper知道這些概要文件在哪些程序集中定義:

  1. services.AddAutoMapper(profileAssembly1, profileAssembly2 /*, ...*/); 

或標(biāo)記類型:

  1. services.AddAutoMapper(typeof(ProfileTypeFromAssembly1), typeof(ProfileTypeFromAssembly2) /*, ...*/); 

現(xiàn)在,您可以在運(yùn)行時(shí)將AutoMapper注入服務(wù)/控制器中:

  1. public class EmployeesController { 
  2.   private readonly IMapper _mapper; 
  3.  
  4.   public EmployeesController(IMapper mapper) => _mapper = mapper; 
  5.  
  6.   // use _mapper.Map or _mapper.ProjectTo 

當(dāng)然還有很多可擴(kuò)展性,比如:

定制類型轉(zhuǎn)換器

有時(shí),您需要完全控制從一種類型到另一種類型的轉(zhuǎn)換。通常,這是當(dāng)一種類型看起來與另一種類型不一樣時(shí),已經(jīng)存在轉(zhuǎn)換函數(shù),并且您希望從“松散”類型變?yōu)楦鼜?qiáng)的類型,例如字符串的源類型到Int32的目標(biāo)類型。

例如,假設(shè)我們的源類型為:

  1. public class Source 
  2.   public string Value1 { get; set; } 
  3.   public string Value2 { get; set; } 
  4.   public string Value3 { get; set; } 

但您想將其映射到:

  1. public class Destination 
  2.   public int Value1 { get; set; } 
  3.   public DateTime Value2 { get; set; } 
  4.   public Type Value3 { get; set; } 

如果我們嘗試按原樣映射這兩種類型,則AutoMapper會(huì)拋出異常(在映射時(shí)和配置檢查時(shí)),因?yàn)锳utoMapper不知道從字符串到int,DateTime或Type的任何映射。要為這些類型創(chuàng)建映射,我們必須提供一個(gè)自定義類型轉(zhuǎn)換器,并且我們可以通過三種方式:

  1. void ConvertUsing(Func<TSource, TDestination> mappingFunction); 
  2. void ConvertUsing(ITypeConverter<TSource, TDestination> converter); 
  3. void ConvertUsing<TTypeConverter>() where TTypeConverter : ITypeConverter<TSource, TDestination>; 

第一個(gè)選項(xiàng)就是任何帶有源并返回目的地的函數(shù)(也有多個(gè)重載)。這適用于簡單的情況,但對于較大的情況則顯得笨拙。在更困難的情況下,我們可以創(chuàng)建一個(gè)自定義的ITypeConverter :

  1. public interface ITypeConverter<in TSource, TDestination> 
  2.   TDestination Convert(TSource source, TDestination destination, ResolutionContext context); 

并向AutoMapper提供一個(gè)自定義類型轉(zhuǎn)換器的實(shí)例,或者為類型提供AutoMapper將在運(yùn)行時(shí)實(shí)例化的類型。我們上面的源/目標(biāo)類型的映射配置將變?yōu)椋?/p>

  1. public void Example() 
  2.     var configuration = new MapperConfiguration(cfg => { 
  3.       cfg.CreateMap<string, int>().ConvertUsing(s => Convert.ToInt32(s)); 
  4.       cfg.CreateMap<string, DateTime>().ConvertUsing(new DateTimeTypeConverter()); 
  5.       cfg.CreateMap<string, Type>().ConvertUsing<TypeTypeConverter>(); 
  6.       cfg.CreateMap<Source, Destination>(); 
  7.     }); 
  8.     configuration.AssertConfigurationIsValid(); 
  9.  
  10.     var source = new Source 
  11.     { 
  12.         Value1 = "5"
  13.         Value2 = "01/01/2000"
  14.         Value3 = "AutoMapperSamples.GlobalTypeConverters.GlobalTypeConverters+Destination" 
  15.     }; 
  16.  
  17.     Destination result = mapper.Map<Source, Destination>(source); 
  18.     result.Value3.ShouldEqual(typeof(Destination)); 
  19.  
  20. public class DateTimeTypeConverter : ITypeConverter<string, DateTime> 
  21.     public DateTime Convert(string source, DateTime destination, ResolutionContext context) 
  22.     { 
  23.         return System.Convert.ToDateTime(source); 
  24.     } 
  25.  
  26. public class TypeTypeConverter : ITypeConverter<string, Type> 
  27.     public Type Convert(string source, Type destination, ResolutionContext context) 
  28.     { 
  29.           return Assembly.GetExecutingAssembly().GetType(source); 
  30.     } 

在第一個(gè)映射中,從字符串到Int32,我們僅使用內(nèi)置的Convert.ToInt32函數(shù)(作為方法組提供)。接下來的兩個(gè)使用自定義ITypeConverter實(shí)現(xiàn)。

自定義類型轉(zhuǎn)換器的真正強(qiáng)大之處在于,只要AutoMapper在任何映射類型上找到源/目標(biāo)對,它們就可以使用。我們可以構(gòu)建一組自定義類型轉(zhuǎn)換器,并在其上使用其他映射配置,而無需任何其他配置。在上面的示例中,我們不必再次指定string / int轉(zhuǎn)換。由于必須在類型成員級別配置自定義值解析器,因此自定義類型轉(zhuǎn)換器的作用域是全局的。

當(dāng)然還有很多功能需要去實(shí)際項(xiàng)目中實(shí)現(xiàn)。

 

責(zé)任編輯:武曉燕 來源: UP技術(shù)控
相關(guān)推薦

2021-02-22 06:41:35

對象AutoMapper映射

2022-08-08 08:25:21

Javajar 文件

2021-12-27 18:00:30

對象數(shù)組Java

2023-12-15 15:03:54

.NETAutoMapper對象映射工具

2021-04-21 14:19:52

javaignalHandle接口

2024-05-17 08:59:02

.NET對象映射庫

2025-01-10 11:07:28

2018-07-03 08:48:48

對象存儲塊存儲

2021-04-27 07:52:18

SQLNULLOR

2021-04-21 21:06:11

數(shù)據(jù)結(jié)構(gòu)

2022-02-08 08:31:52

const關(guān)鍵字C語言

2021-06-30 00:19:43

AOP動(dòng)態(tài)代理

2023-07-07 07:43:37

AutoMapper映射庫

2021-03-10 00:02:01

Redis

2024-01-10 08:08:25

Python空值校驗(yàn)開發(fā)

2021-03-26 00:20:34

NFT區(qū)塊鏈數(shù)據(jù)庫

2021-08-07 07:56:59

Node邏輯對象

2012-05-30 15:03:43

ibmdw

2021-01-12 07:34:13

NetCore 映射器對象

2021-02-06 08:34:49

函數(shù)memoize文檔
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號