zoukankan      html  css  js  c++  java
  • 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
        }
    }
  • 相关阅读:
    Python运行时遇到UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 1: ordinal not in range(128)的问题
    Android 网络通信架构学习
    将Windows MyEclipse的web项目移植到Debian下
    build-essential : Depends: libc6-dev but it is not going to be installed or libc-dev 解决办法
    Debian可用的源 —— 23% waiting for headers解决办法
    将访问服务器的工作交由Service承担
    Servlet回传的数据显示在界面上
    Android客户端和Servlet服务器端通过JSON交互
    Welcome to My Blog!
    【三木夜话】无穷级的恐惧
  • 原文地址:https://www.cnblogs.com/weiweictgu/p/6940098.html
Copyright © 2011-2022 走看看