如何使用 Automapper 进行映射

how to map using Automapper

我需要映射两个对象。要求是火车预订详细信息,其中包含 towardsjourney 和 return 旅程详细信息。

public class ReservationSource
{
    public string ReservationNumber{get;set;} 
    public TravelS towardsTravelS{get;set;}
    public TravelS returnTravelS{get;set;}
}

这是 class 中的 ReservationSource class 是为了捕捉和 return 旅程细节。

public class TravelS
{
   public string travelId{get;set;}
   public ICollection<JourneyS> Journeys{get;set;}
}

以上是预订源对象。此源需要到目标对象的映射。目标对象如下。

public class ReservationDestination
{
    public string ReservationNumber{get;set;}
    public TravelD towardsTravelD{get;set;}
    public TravelD returnTravelD{get;set;}

}

public class TravelD
{
    public string travelId{get;set;}
    public ICollection<JourneyD> Journeys{get;set;}
}
public class JourneyD
{
    public string JourneyId{get;set;}
}
public class JourneyS
{
    public string JourneyId{get;set;}
}

这是我的目标对象。在这里,我想将我的来源映射到目的地。我如何定义映射配置和映射。

var config = new mappingConfiguration(cfg=>
{
cfg.CreateMap<ReservationSource,ReservationDestination>()
});

Imapper map = config.CreateMapper();

这部分代码仅将 reservationNumber 映射到目标对象。有人可以帮我映射所有对象吗?即 towardsTravelStowardsTravelDreturnTravelSreturnTravelD

.net 核心版本:3.1

首先你忘了提这个,但我想还有一个 class TravelS 看起来像这样:

public class TravelS
{
    public string TravelId { get; set; }
}

您的配置中缺少一些东西。目前 AutoMapper 不知道它必须映射具有不同名称的属性(TowardsTravelS => TowardsTravelD 等)所以我们也必须定义它们:

cfg.CreateMap<ReservationSource, ReservationDestination>()
    .ForMember(dest => dest.ReturnTravelD, opt => opt.MapFrom(src => src.ReturnTravelS))
    .ForMember(dest => dest.TowardsTravelD, opt => opt.MapFrom(src => src.TowardsTravelS));

这里我们告诉AutoMapper需要映射这些不同名称的属性。

其次 TravelSTravelD 是不同的 class 所以我们也需要为映射配置它们:

cfg.CreateMap<TravelS, TravelD>();

所以我们现在有这样的东西:

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<ReservationSource, ReservationDestination>()
      .ForMember(dest => dest.ReturnTravelD, opt => opt.MapFrom(src => src.ReturnTravelS))
      .ForMember(dest => dest.TowardsTravelD, opt => opt.MapFrom(src => src.TowardsTravelS));
    cfg.CreateMap<TravelS, TravelD>();
});

var mapper = config.CreateMapper();

var source = new ReservationSource
{
    ReservationNumber = "9821",
    ReturnTravelS = new TravelS
    {
      TravelId = "1"
    },
    TowardsTravelS = new TravelS
    {
      TravelId = "2"
    }
};

var destination = mapper.Map<ReservationDestination>(source);

Console.WriteLine(JsonSerializer.Serialize(destination));

输出:

{"ReservationNumber":"9821","TowardsTravelD":{"TravelId":"2"},"ReturnTravelD":{"TravelId":"1"}}

在这里亲自尝试一下:https://dotnetfiddle.net/FfccVR

在启动时将其添加到您的服务中:

它可重复使用且更清洁

 public void ConfigureServices(IServiceCollection services)
{
            services.AddAutoMapper(Assembly.GetExecutingAssembly());
}

在你的项目中添加这些接口和class

public interface IMapFrom<T>
{
        void Mapping(Profile profile) => profile.CreateMap(typeof(T), GetType());
}
using AutoMapper;
using System;
using System.Linq;
using System.Reflection;

    public class MappingProfile : Profile
    {
        public MappingProfile()
        {
            ApplyMappingsFromAssembly(Assembly.GetExecutingAssembly());
        }

        private void ApplyMappingsFromAssembly(Assembly assembly)
        {
                var types = assembly.GetExportedTypes()
                .Where(t => t.GetInterfaces()
                .Any(i =>i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IMapFrom<>)))
                .ToList();

            foreach (var type in types)
            {
                var instance = Activator.CreateInstance(type);

                var methodInfo = type.GetMethod("Mapping")
                    ?? type.GetInterface("IMapFrom`1").GetMethod("Mapping");

                methodInfo?.Invoke(instance, new object[] { this });

            }
        }
    }

你的源模型是这样的(将 ReservationSource 映射到 ReservationSource):

 public class ReservationSource : IMapFrom<ReservationSource>
    {

        public string Name { get; set; }

        public string City { get; set; }

        public void Mapping(Profile profile)
        {
            profile.CreateMap<ReservationSource,ReservationDestination>()
                       .ForMember(dest => dest.ReturnTravelD, opt => opt.MapFrom(src => src.ReturnTravelS))
                       .ForMember(dest => dest.TowardsTravelD, opt => opt.MapFrom(src => src.TowardsTravelS));
        }
    }