乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       小仙女本仙人 2021-04-07

      概述

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

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

      官網(wǎng)地址:

      http:///

      官方文檔:

      https://docs./en/latest/

      入門

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

      var configuration = new MapperConfiguration(cfg =>
      {
          cfg.ConstructServicesUsing(ObjectFactory.GetInstance);
      
          cfg.CreateMap<Source, Destination>();
      });

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

      var mapper = new Mapper(configuration, childContainer.GetInstance);
      
      var dest = mapper.Map<Source, Destination>(new Source { Value = 15 });

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

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

      或標(biāo)記類型:

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

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

      public class EmployeesController {
        private readonly IMapper _mapper;
      
        public EmployeesController(IMapper mapper) => _mapper = mapper;
      
        // 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è)我們的源類型為:

      public class Source
      {
        public string Value1 { get; set; }
        public string Value2 { get; set; }
        public string Value3 { get; set; }
      }

      但您想將其映射到:

      public class Destination
      {
        public int Value1 { get; set; }
        public DateTime Value2 { get; set; }
        public Type Value3 { get; set; }
      }

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

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

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

      public interface ITypeConverter<in TSource, TDestination>
      {
        TDestination Convert(TSource source, TDestination destination, ResolutionContext context);
      }

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

      public void Example()
      {
          var configuration = new MapperConfiguration(cfg => {
            cfg.CreateMap<string, int>().ConvertUsing(s => Convert.ToInt32(s));
            cfg.CreateMap<string, DateTime>().ConvertUsing(new DateTimeTypeConverter());
            cfg.CreateMap<string, Type>().ConvertUsing<TypeTypeConverter>();
            cfg.CreateMap<Source, Destination>();
          });
          configuration.AssertConfigurationIsValid();
      
          var source = new Source
          {
              Value1 = "5",
              Value2 = "01/01/2000",
              Value3 = "AutoMapperSamples.GlobalTypeConverters.GlobalTypeConverters+Destination"
          };
      
          Destination result = mapper.Map<Source, Destination>(source);
          result.Value3.ShouldEqual(typeof(Destination));
      }
      
      public class DateTimeTypeConverter : ITypeConverter<string, DateTime>
      {
          public DateTime Convert(string source, DateTime destination, ResolutionContext context)
          {
              return System.Convert.ToDateTime(source);
          }
      }
      
      public class TypeTypeConverter : ITypeConverter<string, Type>
      {
          public Type Convert(string source, Type destination, ResolutionContext context)
          {
                return Assembly.GetExecutingAssembly().GetType(source);
          }
      }

      在第一個(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)。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多