2014-01-20 116 views
2

我試圖使用AutoMapper從屬性名稱前有前綴的類中獲取數據,並將其映射到沒有這些前綴的第二個類。但是,我不一定要總是去掉那個前綴:我只是希望它爲這個特定的映射做它。AutoMapper無法識別配置文件特定的前綴

我的源類看起來是這樣的:

public class AdvancedSearchFilterDataModel 
{ 
    // .... 

    public string ServiceMeterNumber { get; set; } 

    // .... 
} 

我的目標類看起來是這樣的:

[DataContract] 
public class ServicesAdvancedSearchFilterData : AdvancedSearchFilterData 
{ 
    // .... 

    [DataMember] 
    public string MeterNumber { get; set; } 

    // .... 
} 

當我嘗試映射這樣的價值觀,它的工作原理:

Mapper.Configuration.RecognizePrefixes("Service"); 
Mapper.CreateMap<AdvancedSearchFilterDataModel, ServicesAdvancedSearchFilterData>(); 
ServicesAdvancedSearchFilterData servciesFilterData = 
    Mapper.Map<ServicesAdvancedSearchFilterData>(model); 

但我只希望「服務」被識別爲某些映射的前綴,因爲它也被用作prope的正常部分rty名稱在其他映射中。我試圖用一個配置文件來處理這個問題,但並沒有工作 - 沒有數據被映射:

Mapper.CreateProfile("ServicePrefix").RecognizePrefixes("Service"); 
Mapper.CreateMap<AdvancedSearchFilterDataModel, ServicesAdvancedSearchFilterData>() 
    .WithProfile("ServicePrefix"); 
ServicesAdvancedSearchFilterData servciesFilterData = 
    Mapper.Map<ServicesAdvancedSearchFilterData>(model); 

我怎樣才能使它識別前綴,只有當我想要它,或者使用配置文件或其他一些技術? (我也有,我要去給需要它認識到以同樣的方式其他映射其他前綴。)

回答

1

我通過創建以下結構來實現此功能:

我有我的觀點的人模型,從PersonCombined

扁平
public class PersonCombined 
{ 
    public Person Person { get; set; } 
    public Address DefaultAddress { get; set; } 
    public Contact EmailContact { get; set; } 
    public Contact PhoneContact { get; set; } 
    public Contact WebsiteContact { get; set; } 
} 

public class Person : IWebServiceModel 
{ 
    public int ID { get; set; } 

    public string PersonFirstName { get; set; } 
    public string PersonSurname { get; set; } 
    public string PersonDescription { get; set; } 
    public Nullable<bool> PersonIsActive { get; set; } 
} 

然後,我有單獨的類此映射只看起來像這樣:

public class PersonCustomMapping : ICustomMapping 
{ 
    const string separator = " "; 

    private static IMappingEngine _MappingEngine; 
    public IMappingEngine MappingEngine 
    { 
     get 
     { 
      if (_MappingEngine == null) 
      { 
       var configuration = new ConfigurationStore(new TypeMapFactory(), AutoMapper.Mappers.MapperRegistry.Mappers); 
       configuration.RecognizePrefixes("Person"); 
       configuration.RecognizeDestinationPrefixes("Person"); 

       configuration.CreateMap<Person, MCIACRM.Model.Combine.PersonCombined>(); 
       configuration.CreateMap<MCIACRM.Model.Combine.PersonCombined, Person>(); 


       _MappingEngine = new MappingEngine(configuration); 
      } 

      return _MappingEngine; 
     } 
    } 
} 

在我一般檢視I H AVE mappingEngine屬性是這樣的:

private IMappingEngine mappingEngine 
    { 
     get 
     { 
      if (_mappingEngine == null) 
      { 
       _mappingEngine = AutoMapper.Mapper.Engine; 
      } 

      return _mappingEngine; 
     } 
    } 

最後,在我的通用視圖構造我有:

public GenericEntityController(IGenericLogic<S> logic, ICustomMapping customMapping) 
     : base() 
    { 
     this._mappingEngine = customMapping.MappingEngine; 
     this.logic = logic; 
    } 

這就是我該怎麼做映射: result = items.Project(mappingEngine).To<R>();logic.Update(mappingEngine.Map<S>(wsItem));

因爲我用1實體每個視圖我可以定義每個實體的自定義映射配置。 希望這會有所幫助

+0

謝謝。我最終以不同的方式實現了這一點,所以我無法對此進行測試,並親自驗證它是否有效,但我會暫時將其標記爲「正確」,並希望對下一個人有幫助誰遇到了這個。 – JJS

+2

在我的愚見中,我發現這個解決方案達到了複雜性的關鍵點。我會手動做。 –

+0

@JJS你能分享一下你實現它的不同方式嗎? – xr280xr