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);
Но я хочу, чтобы "Служба" распознавалась как префикс для определенных сопоставлений, поскольку она также используется как обычная часть имен свойств в других сопоставлениях. Я попытался обработать это с помощью профиля, но это не сработало - данные не были сопоставлены:
Mapper.CreateProfile("ServicePrefix").RecognizePrefixes("Service");
Mapper.CreateMap<AdvancedSearchFilterDataModel, ServicesAdvancedSearchFilterData>()
.WithProfile("ServicePrefix");
ServicesAdvancedSearchFilterData servciesFilterData =
Mapper.Map<ServicesAdvancedSearchFilterData>(model);
Как я могу заставить его распознавать префикс только тогда, когда я этого хочу, используя профили или какую-то другую технику? (У меня также есть другие префиксы, которые мне понадобятся для распознавания других сопоставлений таким же образом.)
1 ответ
Я достиг этой функциональности, создав следующую структуру:
У меня есть модель Person для моего вида, которая сплющена от 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 объект для каждого представления, я могу определить индивидуальную конфигурацию отображения для каждого объекта. Надеюсь это поможет