簡體   English   中英

Automapper - 映射兩個具有相同類型的對象

[英]Automapper - map two objects that have the same type

我有兩個 dto 類:

public class JourneyResponseDto
{
    public short Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public JourneyStatusEnum Status { get; set; }
    public JourneyTypeEnum Type { get; set; }
    public short? StaticSegmentId { get; set; }
    public short? DynamicEventId { get; set; }
    public long? StartTime { get; set; }
    public string BusinessUnit { get; set; }
    public long CreatedBy { get; set; }
    public long CreateDate { get; set; }
    public long? UpdatedBy { get; set; }
    public long? UpdateDate { get; set; }
}

public class JourneyDetailsResponseDto : JourneyResponseDto
{
    public List<JourneyTreeResponseDto> JourneyTrees { get; set; }
}

在我的 Automapper 中,我創建了一個從實體到基礎 dto 響應的映射並映射每個成員:

        CreateMap<Journeys, JourneyResponseDto>()
            .ForMember(dto => dto.Id, opt => opt.MapFrom(x => x.Id))
            .ForMember(dto => dto.Name, opt => opt.MapFrom(x => x.Name))
            .ForMember(dto => dto.Description, opt => opt.MapFrom(x => x.Description))
            .ForMember(dto => dto.Status, opt => opt.MapFrom(x => (JourneyStatusEnum)x.StatusId))
            .ForMember(dto => dto.Type, opt => opt.MapFrom(x => (JourneyTypeEnum)x.TypeId))
            .ForMember(dto => dto.StaticSegmentId, opt => opt.MapFrom(x => x.StaticSegmentId))
            .ForMember(dto => dto.StartTime, opt => opt.MapFrom(x => x.StartTime.ToEpoch(true, offsetMinutes)))
            .ForMember(dto => dto.BusinessUnit, opt => opt.MapFrom(x => x.BusinessUnit))
            .ForMember(dto => dto.DynamicEventId, opt => opt.MapFrom(x => x.DynamicEventId))
            .ForMember(dto => dto.CreateDate, opt => opt.MapFrom(x => x.CreateDate.ToEpoch(true, offsetMinutes)))
            .ForMember(dto => dto.UpdateDate, opt => opt.MapFrom(x => x.UpdateDate.ToEpoch(true, offsetMinutes)))
            .ForMember(dto => dto.CreatedBy, opt => opt.MapFrom(x => x.CreatedBy))
            .ForMember(dto => dto.UpdatedBy, opt => opt.MapFrom(x => x.UpdatedBy));

我想為 Journeys to JourneyDetailsResponseDto 創建地圖,但我想避免上面的代碼重復。

如果我這樣做: CreateMap(Journeys, typeof(JourneyResponseDto)) 我得到錯誤

Journeys 是一種類型,在給定的上下文中無效

如果我這樣做: CreateMap(typeof(Journeys), typeof(JourneyResponseDto)) 實體的每個成員都會出錯

“對象不包含 Id 的定義,並且找不到接受“對象”類型的第一個參數的可訪問擴展方法“Id”(您是否缺少 using 指令或程序集引用)

我正在考慮擴展方法,但現在我寧願嘗試對這兩種類型執行通用方法並使用它。

到目前為止,我設法做到了:

private IMappingExpression<Journeys, JourneyResponseDto> MapJourneyToResponseDto(int offsetMinutes)
{
    return CreateMap<Journeys, JourneyResponseDto>()
        .ForMember(dto => dto.Id, opt => opt.MapFrom(x => x.Id))
        .ForMember(dto => dto.Name, opt => opt.MapFrom(x => x.Name))
        .ForMember(dto => dto.Description, opt => opt.MapFrom(x => x.Description))
        .ForMember(dto => dto.Status, opt => opt.MapFrom(x => (JourneyStatusEnum)x.StatusId))
        .ForMember(dto => dto.Type, opt => opt.MapFrom(x => (JourneyTypeEnum)x.TypeId))
        .ForMember(dto => dto.StaticSegmentId, opt => opt.MapFrom(x => x.StaticSegmentId))
        .ForMember(dto => dto.StartTime, opt => opt.MapFrom(x => x.StartTime.ToEpoch(true, offsetMinutes)))
        .ForMember(dto => dto.BusinessUnit, opt => opt.MapFrom(x => x.BusinessUnit))
        .ForMember(dto => dto.DynamicEventId, opt => opt.MapFrom(x => x.DynamicEventId))
        .ForMember(dto => dto.CreateDate, opt => opt.MapFrom(x => x.CreateDate.ToEpoch(true, offsetMinutes)))
        .ForMember(dto => dto.UpdateDate, opt => opt.MapFrom(x => x.UpdateDate.ToEpoch(true, offsetMinutes)))
        .ForMember(dto => dto.CreatedBy, opt => opt.MapFrom(x => x.CreatedBy))
        .ForMember(dto => dto.UpdatedBy, opt => opt.MapFrom(x => x.UpdatedBy));
}

但是,我無法使用 JourneyDetailsResponseDto,因為這里的任何類型的使用都會引發上述錯誤。

由於JourneysJourneyResponseDto具有相同的屬性名稱,因此無需為每個屬性編寫.ForMember() ,映射器將自動映射它們。

CreateMap<Journeys, JourneyResponseDto>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM