我正在尝试使用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);
但我只想将“Service”识别为某些映射的前缀,因为它也被用作其他映射中属性名称的正常部分。我尝试使用配置文件处理此问题,但这不起作用 - 没有映射数据:
Mapper.CreateProfile("ServicePrefix").RecognizePrefixes("Service");
Mapper.CreateMap<AdvancedSearchFilterDataModel, ServicesAdvancedSearchFilterData>()
.WithProfile("ServicePrefix");
ServicesAdvancedSearchFilterData servciesFilterData =
Mapper.Map<ServicesAdvancedSearchFilterData>(model);
如何使用配置文件或其他技术,只有在我需要时才能识别前缀? (我还有其他前缀,我需要它以同样的方式识别其他映射。)
答案 0 :(得分:2)
我通过创建以下结构来实现此功能:
我的观点的人物模型是从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;
}
}
}
在我的通用视图中,我有这样的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个实体,所以我可以为每个实体定义自定义映射配置。 希望这有帮助