2017-04-26 52 views
0

我想爲AutoMapper映射引擎創建通用包裝器。我的最終目標是綁定到一個接口。AutoMapper:爲映射引擎創建通用包裝器

public interface IMappingEngine 
{ 
    TDestination Map<TSource, TDestination>(TSource source); 
} 

我會用DI解決它。

然後我基於AutoMapper MappingEngine創建此接口的實現。

public class AutoMapperMappingEngine : IMappingEngine 
{ 
    private readonly ConfigurationStore configurationStore; 
    private readonly MappingEngine mappingEngine; 

    public AutoMapperMappingEngine() 
    { 
     this.configurationStore = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers); 
     this.RegisterMappings(); 
     this.configurationStore.AssertConfigurationIsValid(); 
     this.mappingEngine = new MappingEngine(this.configurationStore); 
    } 

    /// <summary> 
    /// This method registers alternate mappings for already existing mappings. 
    /// </summary> 
    private void RegisterMappings() 
    { 
     // some code 
     // this.configurationStore.CreateMap<> 
    } 

    public TDestination Map<TSource, TDestination>(TSource source) 
    { 
     TDestination mappingResult = this.mappingEngine.Map<TDestination>(source); 
     return mappingResult; 
    } 
} 

但我堅持一個問題。如果我需要同一對類型的兩個以上不同映射,會發生什麼?

IMappingEngine autoMapperMappingEngine; 
// Initialize autoMapperMappingEngine 
FooModel result; 

if(firstCondition) 
{ 
    result = autoMapperMappingEngine.Map<FooEntity, FooModel>(entity); 
} 
else 
{ 
    if(secondCondition) 
    { 
     result = autoMapperMappingEngine.Map<FooEntity, FooModel>(entity); 
    } 
    else 
    { 
     result = autoMapperMappingEngine.Map<FooEntity, FooModel>(entity); 
    } 
} 

如果我註冊的RegisterMappings內按順序幾個不同的映射最後映射將重疊的休息。你可以給一些建議如何實現我想要的嗎?

回答

1

改用實例API;

https://github.com/AutoMapper/AutoMapper/wiki/Static-and-Instance-API

這包括創建一個配置和使用該映射,這樣就可以有多種配置......當然,你將不得不延長你的界面

+0

的問題是,你看到的只是我的我堅持一個簡單的問題。我的一般項目有很多層次。在每一層我使用'Mapper.CreateMap <>'方法來註冊我的映射。當我需要一個備用映射時,我需要在某些特殊情況下使用'MappingEngine'。 –

+0

@JosephKatzman對不起,我不明白你的意思?使用配置實例當然應該滿足任何要求,你可以試着解釋爲什麼這不起作用嗎?什麼特殊情況?爲什麼他們不包含具有不同映射的多個配置? – Milney

+0

我有一個大項目。我不能重寫依賴於靜態Mapper.CreateMap <>'的代碼部分。這就是我使用'MappingEngine'的原因。我知道我應該使用上面介紹的接口來重寫我的項目。我們假設不可能重寫它。這對我來說是一個挑戰;)還有其他方法來實現我想要的? –