AutoMapper и "UseDestinationValue"
Что делает UseDestinationValue?
Я спрашиваю, потому что у меня есть базовый и унаследованный класс, а для базового класса я бы хотел, чтобы AutoMapper использовал для меня существующие значения.
Будет ли это делать? (Я посмотрел, и единственные примеры, которые я вижу для UseDestinationValue
, включают списки. Это только для списков?
Могу ли я сделать это:
PersonContract personContract = new PersonContract {Name = 'Dan'};
Person person = new Person {Name = "Bob"};
Mapper.CreateMap<PersonContract, Person>()
.ForMember(x=>x.Name, opt=>opt.UseDestinationValue());
person = Mapper.Map<PersonContract, Person>(personContract);
Console.WriteLine(person.Name);
и вывод должен быть bob?
Ответы
Ответ 1
Я написал весь этот вопрос и подумал, ДУХ! просто запустите его и посмотрите.
Он работает так, как я надеялся.
Это код, в котором я закончил:
class Program
{
static void Main(string[] args)
{
PersonContract personContract = new PersonContract {NickName = "Dan"};
Person person = new Person {Name = "Robert", NickName = "Bob"};
Mapper.CreateMap<PersonContract, Person>()
.ForMember(x => x.Name, opt =>
{
opt.UseDestinationValue();
opt.Ignore();
});
Mapper.AssertConfigurationIsValid();
var personOut =
Mapper.Map<PersonContract, Person>(personContract, person);
Console.WriteLine(person.Name);
Console.WriteLine(person.NickName);
Console.WriteLine(personOut.Name);
Console.WriteLine(personOut.NickName);
Console.ReadLine();
}
}
internal class Person
{
public string Name { get; set; }
public string NickName { get; set; }
}
internal class PersonContract
{
public string NickName { get; set; }
}
Выход был:
Роберт
Dan
Роберт
Dan
Ответ 2
Меня сюда привел аналогичный вопрос, но в отношении вложенных классов и сохранения значения назначения. Я пробовал все, что мог, но это не сработало для меня, оказалось, что вы также должны использовать UseDestinationValue для родительского объекта. Я оставляю это здесь, если у кого-то еще есть такая же проблема. Мне потребовалось некоторое время, чтобы заставить его работать. Я все время думал, что проблема заключается в адресе AddressViewModel = > Address mapping.
В классе BidderViewModel BidderAddress имеет тип AddressViewModel. Мне нужно, чтобы идентификатор адреса сохранялся в ситуациях, когда он не равен нулю.
Mapper.CreateMap<BidderViewModel, Bidder>()
.ForMember(dest => dest.BidderAddress, opt=> opt.UseDestinationValue())
.ForMember(dest => dest.ID, opt => opt.UseDestinationValue());
Mapper.CreateMap<AddressViewModel, Address>()
.ForMember(dest => dest.ID, opt => { opt.UseDestinationValue(); opt.Ignore(); });
Использовать (где viewModel имеет тип BidderViewModel, возвращаемый представлением в MVC):
Bidder bidder = Mapper.Map<BidderViewModel, Bidder>(viewModel, currentBid.Bidder)