2016-12-21 63 views
2

對於AutoMapper,我實現了其工作原理如下,但重複的映射代碼: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))); 

兩個RmsOelEntryUnlinkedPersonInputDtoRmsOelEntryUnlinkedAddressInputDtoRmsOelEntryInvolvedEntityBaseDto繼承這個基類具有屬性EffectiveFromTimeEffectiveToTime

我不想重複如上所示映射EffectiveFromTimeEffectiveToTime

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

如何優化此刪除重複的映射?

回答

3

我有類似的情況,並訴諸助手擴展方法。我爲您定製的情況:

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 { } 
+1

感謝。在您的擴展方法中,我看到目標被約束爲AddNewOELEntryInvolvedEntitiesUnlinkedInvolvedPersonUnlinked,但它也需要映射AddNewOELEntryInvolvedEntitiesUnlinkedInvolvedAddressUnlinked。這將如何工作? – Howard

+0

查看更新的答案:)如果生成的類是部分的,請打開問題? –

+0

當然,如果這種情況比兩種映射更普遍,那麼這樣做會付出代價。 –