#c# #automapper #codeplex
#c# #automapper #codeplex
Вопрос:
Mapper.CreateMap<BusinessObject, Proxy.DataContacts.DCObject>()
.ForMember(x => x.ExtensionData, y => y.Ignore())
.ForMember(z => z.ValidPlaces, a=> a.ResolveUsing(typeof(ValidPlaces)));
Mapper.AssertConfigurationIsValid();
proxydcObject = Mapper.Map<BusinessObject, Proxy.DataContracts.DCObject>(_instanceOfBusinessObject); //throws an exception saying ValidPlaces could not be resolved
public class BusinessObject
{
public Enum1 Enum1 { get; set; }
public List<ValidPlaces> ValidPlaces{ get; set; }
}
public class ValidPlaces
{
public int No { get; set; }
public string Name { get; set; }
}
public class DCObject
{
[DataMember]
public Enum1 Enum1 { get; set; }
[DataMember]
public List<ValidPlaces> ValidPlaces{ get; set; }
}
Mapper.CreateMap работает, когда вызывается функция поиска Mapper.AssertConfigurationIsValid();
(в этой строке нет исключений), но
когда я на самом деле вызываю службу WCF в следующей строке, которая здесь не показана, Automapper выдает исключение, в котором говорится, что допустимые места не могут быть сопоставлены.Работает нормально, если я помещаю Ignore() в свойство ValidPlaces, но в идеале хочу, чтобы это было передано.
Пожалуйста, помогите любым экспертам по AutoMapper.
Ответ №1:
Вы должны быть в состоянии удалить строку для допустимых мест:
Mapper.CreateMap<BusinessObject, Proxy.DataContacts.DCObject>()
.ForMember(x => x.ExtensionData, y => y.Ignore());
Преобразователи значений предназначены для пользовательского класса для выполнения разрешения значений и должны иметь тип IValueResolver. Это некоторая защитная кодировка, которую я должен внедрить. Но для списка T -> списка U, пока AutoMapper может отображать T -> U, это будет работать. В вашей ситуации, поскольку T == U, вам не нужно делать ничего дополнительного. В противном случае вам придется сопоставить T с U (но не список T -> Список U).
Комментарии:
1. Мой DCObject имеет extensiondata, но бизнес-объект не обладает этим свойством, и, следовательно, я устанавливаю его на место, иначе я получаю ошибку. В моем случае также T == U, но я хочу, чтобы List<T> был переведен в List<U>
2. Это нормально. AutoMapper поддерживает List<T> автоматически, без какой-либо дополнительной настройки. Я могу сделать это: Mapper.Map<int[], List<int>>(новый [] {1, 2, 3}); С нулевой конфигурацией. Вам нужно только зарегистрировать типы элементов, и поскольку в вашем случае типы элементов идентичны, дополнительная настройка не требуется. AutoMapper поддерживает назначаемые типы «из коробки».