AutoMapper и "UseDestinationValue" - PullRequest
       5

AutoMapper и "UseDestinationValue"

5 голосов
/ 17 августа 2011

Что делает 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

Ответы [ 2 ]

3 голосов
/ 17 августа 2011

Я написал весь этот вопрос, а затем подумал: Ой!просто запустите его и посмотрите.

Это работает так, как я и надеялся.

Это код, с которым я закончил:

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; }
}

Вывод был:

Роберт
Дан
Роберт
Дан

2 голосов
/ 08 августа 2012

Меня привели с таким же вопросом, но в отношении вложенных классов и сохранения значения назначения. Я пробовал выше любым способом, но у меня это не сработало, оказывается, вы должны использовать UseDestinationValue и для родительского объекта. Я оставляю это здесь на случай, если у кого-то еще возникнет та же проблема, что и у меня. Мне потребовалось некоторое время, чтобы заставить это работать. Я продолжал думать, что проблема заключается в AddressViewModel => Отображение адреса.

В классе 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...