簡體   English   中英

自動映射器基類映射

[英]Automapper base class mapping

對於AutoMapper,我實現了以下可行的方法,但是重復了映射代碼:

cfg.CreateMap<RmsOelEntryUnlinkedPersonInputDto, AddNewOELEntryInvolvedEntitiesUnlinkedInvolvedPersonUnlinked>()
    .ForMember(dest => dest.DateOfBirth, opts => opts.MapFrom(src => FormatDateType(src.DateOfBirth)))
    .ForMember(dest => dest.EffectiveFromTime, opts => opts.MapFrom(src => FormatDateTimeType(src.EffectiveFromTime)))
    .ForMember(dest => dest.EffectiveToTime, opts => opts.MapFrom(src => FormatDateTimeType(src.EffectiveToTime)));

cfg.CreateMap<RmsOelEntryUnlinkedAddressInputDto, AddNewOELEntryInvolvedEntitiesUnlinkedInvolvedAddressUnlinked>()
    .ForMember(dest => dest.EffectiveFromTime, opts => opts.MapFrom(src => FormatDateTimeType(src.EffectiveFromTime)))
    .ForMember(dest => dest.EffectiveToTime, opts => opts.MapFrom(src => FormatDateTimeType(src.EffectiveToTime)));

RmsOelEntryUnlinkedPersonInputDtoRmsOelEntryUnlinkedAddressInputDto均從RmsOelEntryInvolvedEntityBaseDto繼承,並且此基類具有EffectiveFromTimeEffectiveToTime屬性。

我不希望必須如上所述反復映射EffectiveFromTimeEffectiveToTime

但是, AddNewOELEntryInvolvedEntitiesUnlinkedInvolvedPersonUnlinkedAddNewOELEntryInvolvedEntitiesUnlinkedInvolvedAddressUnlinked是自動生成的,沒有基類。 因此,我看不到如何使用AutoMapper的“包含”映射選項。

如何優化此設置以刪除重復的映射?

我有類似的情況,並求助於輔助擴展方法。 我為您量身定做:

internal static class CommonMapperExtensions
{
     internal static IMappingExpression<TSource, TDestination> MapCommonFields<TSource, TDestination>(this IMappingExpression<TSource, TDestination> m)
         where TSource : RmsOelEntryInvolvedEntityBaseDto
         where TDestination : IEffective
     {
         return m
            .ForMember(dest => dest.EffectiveFromTime, opts => opts.MapFrom(src => FormatDateTimeType(src.EffectiveFromTime)))
            .ForMember(dest => dest.EffectiveToTime, opts => opts.MapFrom(src => FormatDateTimeType(src.EffectiveToTime)));                
     }
}

然后配置如下所示:

cfg.CreateMap<RmsOelEntryUnlinkedPersonInputDto, AddNewOELEntryInvolvedEntitiesUnlinkedInvolvedPersonUnlinked>()
    .MapCommonFields()
    .ForMember(dest => dest.DateOfBirth, opts => opts.MapFrom(src => FormatDateType(src.DateOfBirth)));

cfg.CreateMap<RmsOelEntryUnlinkedAddressInputDto, AddNewOELEntryInvolvedEntitiesUnlinkedInvolvedAddressUnlinked>()
    .MapCommonFields();

如果自動生成AddNewOELEntryInvolvedEntitiesUnlinkedInvolvedAddressUnlinkedAddNewOELEntryInvolvedEntitiesUnlinkedInvolvedPersonUnlinked是自動生成的,那么我認為它們是局部的。

然后,您可以為這些類創建通用接口:

public interface IEffective 
{
     DateTime EffectiveFromTime {get; set;}
     DateTime EffectiveToTime {get; set;}
}

public partial AddNewOELEntryInvolvedEntitiesUnlinkedInvolvedAddressUnlinked
    : IEffective { }

public partial AddNewOELEntryInvolvedEntitiesUnlinkedInvolvedPersonUnlinked
    : IEffective { }
public class TBaseModel
{
    public void ConfigureMapFrom(IMappingExpression<TEntity, TBaseModel> mapping)
    {
        // ... mappings
    }
}

public class TModel : TBaseModel
{
    public void ConfigureMapFrom(IMappingExpression<TEntity, TModel> mapping)
    {
        mapping.IncludeBase<TEntity, TBaseModel>();

        // ... other mappings
    }
}

暫無
暫無

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

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