AutoMapper的使用


常規的使用,一般先初始化配置,一個應用只需初始化一次

 Mapper.Initialize(cfg => cfg.CreateMap<Order, OrderDto>());
    //or
    var config = new MapperConfiguration(cfg => cfg.CreateMap<Order, OrderDto>());
var mapper = config.CreateMapper();
// or
var mapper = new Mapper(config);
OrderDto dto = mapper.Map<OrderDto>(order);
// or
OrderDto dto = Mapper.Map<OrderDto>(order);

使用AutoMapper進行Entity與DTO之間的轉換,不同字段之間的映射轉換

 AutoMapper.Mapper.Initialize(cfg => cfg.CreateMap<StreetEvent, StreetEventDTO>()
            .ForMember(dest => dest.EvtSrc, opt => opt.MapFrom(src => src.evt_src))
            .ForMember(dest => dest.MapId, opt => opt.MapFrom(src => src.map_id))
            );

            var targetList = AutoMapper.Mapper.Map<List<StreetEventDTO>>(list);

實體之間的自定義類型轉換,參考:

https://github.com/AutoMapper/AutoMapper/wiki/Custom-type-converters

   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; }
    }

[Test]
    public void Example()
    {
        Mapper.Initialize(cfg => {
          cfg.CreateMap<string, int>().ConvertUsing(Convert.ToInt32);
          cfg.CreateMap<string, DateTime>().ConvertUsing(new DateTimeTypeConverter());
          cfg.CreateMap<string, Type>().ConvertUsing<TypeTypeConverter>();
          cfg.CreateMap<Source, Destination>();
        });
        Mapper.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 context.SourceType;
        }
    }

自定義實體值的轉換,適用於目標與源實體直接的值類型計算,參考

https://github.com/AutoMapper/AutoMapper/wiki/Custom-value-resolvers

public class Source
    {
        public int Value1 { get; set; }
        public int Value2 { get; set; }
    }
    
    public class Destination
    {
        public int Total { get; set; }
    }

  public class CustomResolver : IValueResolver<Source, Destination, int>
    {
        public int Resolve(Source source, Destination destination, int member, ResolutionContext context)
        {
            return source.Value1 + source.Value2;
        }
    }

Mapper.Initialize(cfg => 
       cfg.CreateMap<Source, Destination>()
         .ForMember(dest => dest.Total, opt => opt.ResolveUsing<CustomResolver>());
    Mapper.AssertConfigurationIsValid();
    
    var source = new Source
        {
            Value1 = 5,
            Value2 = 7
        };
    
    var result = Mapper.Map<Source, Destination>(source);
    
    result.Total.ShouldEqual(12);
public class MultBy2Resolver : IValueResolver<object, object, int> {
    public int Resolve(object source, object dest, int destMember, ResolutionContext context) {
        return destMember * 2;
    }
}

  Mapper.Initialize(cfg => cfg.CreateMap<Source, Destination>()
        .ForMember(dest => dest.Total, 
            opt => opt.ResolveUsing(new CustomResolver())
        );



Mapper.Initialize(cfg => {
cfg.CreateMap<Source, Destination>()
    .ForMember(dest => dest.Total,
        opt => opt.ResolveUsing<CustomResolver, decimal>(src => src.SubTotal));
cfg.CreateMap<OtherSource, OtherDest>()
    .ForMember(dest => dest.OtherTotal,
        opt => opt.ResolveUsing<CustomResolver, decimal>(src => src.OtherSubTotal));
});

public class CustomResolver : IMemberValueResolver<object, object, decimal, decimal> {
    public decimal Resolve(object source, object destination, decimal sourceMember, decimal destinationMember, ResolutionContext context) {
// logic here
    }
}

 


免責聲明!

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



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