Я использую автоматический картопостроитель для отображения нескольких объектов (класс дб в объекты пользовательского интерфейса).
Карта 1:
Mapper.CreateMap<sourceone, destination>().ForMember(sss => sss.one, m => m.MapFrom(source => source.abc));
Карта 2:
Mapper.CreateMap<sourcetwo, destination>().ForMember(sss => sss.two, m => m.MapFrom(source => source.xyz));
destination d = new destination();
//Карта 1
d = AutoMapper.Mapper.Map<sourceone, destination>(sourceone);
//Карта 2
d = AutoMapper.Mapper.Map<sourcetwo, destination>(sourcetwo);
После того как я выполняю вызов к 'Карте 2', значения, которые заполняются с помощью Карты 1, потеряны.. (т.е. destination.one становится пустым). Как я фиксирую это?
Согласно мне необходимо постараться не называть перегруженный метод Карты, берущий экземпляр целевого объекта, как объяснено в принятом ответе. Это не позволит Вам тестировать/проверять свою конфигурацию отображения (Mapper.Configuration.AssertConfigurationIsValid()
), или сделать так Вы добавите много 'Ignore' в Ваших отображениях.
очень простое решение А состоит в том, чтобы создать составной тип, содержащий исходные ссылки, и определить Ваше отображение на место назначения на основе того составного типа.
Что-то как:
public class SourceOneTwo
{
public SourceOne SourceOne { get; set; }
public SourceTwo SourceTwo { get; set; }
}
static void Main(string[] args)
{
var config = new MapperConfiguration(cfg =>
cfg.CreateMap<SourceOneTwo, Destination>()
.ForMember(dest => dest.one, m => m.MapFrom(source => source.SourceOne.abc))
.ForMember(dest => dest.two, m => m.MapFrom(source => source.SourceTwo.xyz)));
config.AssertConfigurationIsValid();
}