2016-12-21 8 views
2

Für AutoMapper, habe ich folgendes implementiert, die funktioniert, aber hat Mapping-Code wiederholt:AutoMapper Basisklasse Mapping

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))); 

Beide RmsOelEntryUnlinkedPersonInputDto und RmsOelEntryUnlinkedAddressInputDto sind geerbt von RmsOelEntryInvolvedEntityBaseDto und diese Basisklasse hat die Eigenschaften EffectiveFromTime und EffectiveToTime .

Ich möchte nicht die EffectiveFromTime und EffectiveToTime wie oben gesehen wiederholt abbilden müssen.

AddNewOELEntryInvolvedEntitiesUnlinkedInvolvedPersonUnlinked und AddNewOELEntryInvolvedEntitiesUnlinkedInvolvedAddressUnlinked sind jedoch automatisch generiert und haben keine Basisklasse. Daher sehe ich nicht, wie ich AutoMappers "Include" Mapping-Option verwenden kann.

Wie kann ich dies optimieren, um das wiederholte Mapping zu entfernen?

Antwort

3

Ich hatte ähnliche Situation und habe auf Helfer-Extension-Methoden zurückgegriffen. Ich angepasst für Ihren Fall:

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)));     
    } 
} 

Dann Konfiguration würde wie folgt aussehen:

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

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

Wenn AddNewOELEntryInvolvedEntitiesUnlinkedInvolvedAddressUnlinked und AddNewOELEntryInvolvedEntitiesUnlinkedInvolvedPersonUnlinked werden automatisch generiert Ich würde annehmen, dass sie teilweise sind.

Dann könnten Sie gemeinsame Schnittstelle für diese Klassen machen:

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

public partial AddNewOELEntryInvolvedEntitiesUnlinkedInvolvedAddressUnlinked 
    : IEffective { } 

public partial AddNewOELEntryInvolvedEntitiesUnlinkedInvolvedPersonUnlinked 
    : IEffective { } 
+1

Dank. In Ihrer Erweiterungsmethode sehe ich, dass das Ziel als AddNewOELEntryInvolvedEntitiesUnlinkedInvolvedPersonUnlinked eingeschränkt ist, aber es muss auch AddNewOELEntryInvolvedEntitiesUnlinkedInvolvedAddressUnlinked zugeordnet werden. Wie würde das funktionieren? – Howard

+0

Siehe aktualisierte Antwort :) Offene Frage, wenn generierte Klassen unvollständig sind? –

+0

Natürlich würde dies sich auszahlen, wenn dieser Fall häufiger vorkommt als zwei Mappings. –