2014-01-20 78 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