成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

對(duì)象到對(duì)象映射-AutoMapper

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

[[382776]]

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

 概述

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

用來解決一個(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<Source, Destination>(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è)重載)。這適用于簡單的情況,但對(duì)于較大的情況則顯得笨拙。在更困難的情況下,我們可以創(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)對(duì),它們就可以使用。我們可以構(gòu)建一組自定義類型轉(zhuǎn)換器,并在其上使用其他映射配置,而無需任何其他配置。在上面的示例中,我們不必再次指定string / int轉(zhuǎn)換。由于必須在類型成員級(jí)別配置自定義值解析器,因此自定義類型轉(zhuǎn)換器的作用域是全局的。

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

 

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

2021-05-31 06:28:35

AutoMapper對(duì)象映射器

2023-12-15 15:03:54

.NETAutoMapper對(duì)象映射工具

2024-05-17 08:59:02

.NET對(duì)象映射庫

2023-07-07 07:43:37

AutoMapper映射庫

2009-09-23 13:26:10

Hibernate對(duì)象

2012-05-10 09:44:39

MongoDBJava

2012-02-08 12:17:38

HibernateJava

2012-02-08 14:01:18

HibernateJava

2021-01-12 07:34:13

NetCore 映射器對(duì)象

2024-02-26 08:15:00

數(shù)據(jù)映代碼開發(fā)

2012-05-30 15:03:43

ibmdw

2020-07-09 07:43:13

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

2009-07-20 13:47:08

iBATIS.NET字

2020-07-28 08:00:03

存儲(chǔ)數(shù)據(jù)技術(shù)

2021-11-11 17:36:07

鴻蒙HarmonyOS應(yīng)用

2024-04-24 08:32:55

.NET對(duì)象映射

2021-11-29 09:48:35

Redis 對(duì)象映射

2023-01-10 09:38:09

面向對(duì)象系統(tǒng)

2021-09-03 15:41:00

鴻蒙HarmonyOS應(yīng)用

2023-12-22 10:40:16

Mapster.NET開源
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 黑人巨大精品欧美黑白配亚洲 | 国产高清一区二区 | 99久久免费精品 | 一级毛片视频在线 | a欧美| 五月婷六月丁香 | 久久久久久久久一区 | 欧美二区三区 | www.五月天婷婷 | 一区二区在线看 | 黑人久久久 | 久草在线青青草 | 小草久久久久久久久爱六 | 一级特黄色毛片 | 91成人在线 | 久久国产精品久久久久久久久久 | 少妇一级淫片免费播放 | 狠狠干美女| 中文字幕视频三区 | 在线免费看黄 | 日本天堂视频在线观看 | 女女百合av大片一区二区三区九县 | 国产精品视频久久 | 久久高清 | 一区二区伦理电影 | 日本特黄a级高清免费大片 成年人黄色小视频 | 亚洲乱码国产乱码精品精的特点 | 午夜久久久 | 国产精品久久久久久久久免费樱桃 | 欧美精品在线免费 | 草久久久 | 午夜精品福利视频 | 人人草人人干 | 国产视频第一页 | 一区二区三区四区日韩 | 中文字幕不卡一区 | 草樱av| 午夜精品久久久久久久星辰影院 | 91欧美激情一区二区三区成人 | 成人精品一区亚洲午夜久久久 | 范冰冰一级做a爰片久久毛片 |