В автомате, где вы создаете карту, вы можете указать дополнительные процессы для конкретных членов типа назначения.
Итак, где ваша карта по умолчанию будет
Mapper.Map<Domain.User, UsersDetailsViewModel>();
, существует свободный синтаксис для определения более сложных отображений:
Mapper.Map<Domain.User, UsersDetailsViewModel>()
.ForMember(vm=>vm.UserName, m=>m.MapFrom(u=>(u.UserName != null)
? u.UserName
: "User" + u.ID.ToString()));
Здесь ForMember принимает два аргумента, первый определяет свойство, которое вы отображаете. Второй предоставляет средства определения отображения. В качестве примера я выбрал и показал одно из простых отображений.
Если вам требуется более сложное отображение (например, отображение CurrentUser), вы можете создать класс, который реализует интерфейс IResolver, включить логику отображения в эти новые предложения, а затем добавить это в отображение.
Mapper.Map<Domain.User, UsersDetailsViewModel>()
.ForMember(vm=>vm.IsUserMatch, m=>m.ResolveUsing<MatchingUserResolver>()));
Когда Mapper придет, чтобы сделать отображение, он вызовет ваш пользовательский преобразователь.
Как только вы обнаружите синтаксис метода .ForMember, все остальные виды слотов встанут на свои места.
Я думаю, что синтаксис немного изменился в 2019 (Ядро ASP.NET 2.2), этот метод теперь обрабатывается с MapperConfiguration, и статические методы не более доступны.
, Но я соглашаюсь с @KJSR, это сообщение является все еще действительно полезным:-)
private Mapper UserMapper= new Mapper(new MapperConfiguration(cfg => (cfg.CreateMap<Domain.User, UsersDetailsViewModel>())
.ForMember(x=>x.Email, y=>y.MapFrom(z=>z.Email))
.ForMember(x => x.UserName , y => y.MapFrom(user => (user.UserName != null) ? user.UserName : "User" + user.ID.ToString))));