2017-04-27 112 views
2

比方說,我們有映射兩個源類型,和一個目的:「商店」對象

class TSource 
{ 
    public float A { get; set; } 
    public float B { get; set; } 
} 

class TSupport 
{ 
    public float C { get; set; } 
    public float D { get; set; } 
} 

class TDestination 
{ 
    public float A { get; set; } 
    public float B { get; set; } 
    public float C { get; set; } 
    public float D { get; set; } 
} 

,並與一些方法獲得TSupport的情況下,使用TSource例如:

Mapper.CreateMap<TSource, TDestination>(); 
Mapper.CreateMap<TSupport, TDestination>(); 
//... 
var support = GetSupportInstance(source); 

var destination = Mapper.Map<TSource, TDestination>(source); 
Mapper.Map(support, destination); 

這也可以在單來完成:

private TSupport GetSupportInstance(TSource source) 

所以,通常情況下,我會用雙重映射做到這一點使用手動決心映射:

Mapper.CreateMap<TSource, TDestination>() 
    .ForMember(desc => desc.C, opt => opt.ResolveUsing(src => 
    { 
     var support = GetSupportInstance(src); 
     return support.C; 
    })) 
    .ForMember(desc => desc.D, opt => opt.ResolveUsing(src => 
    { 
     var support = GetSupportInstance(src); 
     return support.D; 
    })); 

正如你所看到的,我使用的是GetSupportInstance兩次,爲每個屬性。所以,最後,我的問題是 - 是否有可能獲得一次映射的支持,以某種方式存儲它,並在不同屬性的映射中重用它?

回答

0

如何:

Mapper.CreateMap<TSource, TDestination>() 
    .ForMember(d => d.C, x => x.Ignore()) 
    .ForMember(d => d.D, x => x.Ignore()) 
    .AfterMap((src, dst) => { 
     var support = GetSupportInstance(src); 
     dst.C = support.C; 
     dst.D = support.D; 
    }); 
+0

這是否會遵守AssertConfigurationIsValid'的'財產檢查? – lentinant

+0

它不會。繼續,我正在努力 – nocodename

+0

那麼,你可以'忽略()'屬性'C'和'D',然後'AssertConfigurationIsValid'通過。 – nocodename

0

我可能會去使用緩存你需要的情況下自定義解析。它看起來像這樣。

public class MySupportInstanceResolver : ValueResolver<TSource, TDestination> 
{ 
    private static readonly ISupportInstance _supportInstance; 

    [ImportingConstructor] 
    public MySupportInstanceResolver() 
    { 
     _supportInstance=GetSupportInstance(); 
    } 

    protected override string ResolveCore(Journal source) 
    { 
     return _supportInstance; 
    } 
} 

然後,你可以使用它作爲:

cfg.CreateMap<TSource, Tdest>() 
     .ForMember(dest => dest.C, 
      opt => opt.ResolveUsing<MySupportInstanceResolver>().FromMember(name => name.C)); 
});