mappingConfiguration.CreateMapping<Person, PersonViewModel>(
p => new PersonViewModel
{
FullName = $"{p.FirstName} {p.LastName}",
Age = Helpers.CalculateAge(p.BirthDate),
Bar = 5,
Foo = MappingOptions.Ignore()
});
Этот код только выглядит как создание нового экземпляра и перенос свойств вручную. На деле это лямбда-выражение, из которого компилятор c# генерит ExpressionTree, из которого в свою очередь можно получить всю нужную информацию для создания маппинга. В примере сопоставляются только различающиеся свойства. Идентичные свойства из обоих классов сопоставятся автоматически.
Да уж, жестко я опечатался, прямо в названии проекта, сборки и пакета.
Вложенных маппингов нет. Если честно, он пока даже простые типы не умеет автоматически преобразовывать друг к другу, например, из числа в строку. В какой-то степени это вытекает из синтаксиса конфигурации. Если названия свойств совпадают, то там еще можно автоматом сопоставить, но если различаются, и вам нужно будет их явно связать, то вам просто компилятор не даст присвоить одно в другое, если у них будут отличаться типы.
Аналога ProjectTo тоже нет, но согласен, что функция это очень интересная, постараюсь ее реализовать в будущем.
Да, я искал аналогичные либы. ExpressMapper, Mapster, еще TinyMapper гугл выдает, они все имеют абсолютно аналогичный синтаксис создания маппинга автомапперу. Проблемы, которые у меня возникали при работе с автомаппером, я в той или иной степени решал допиливая для него небольшие расширения, но именно идея более простого синтаксиса сподвигла меня на написание собственной либы. Сравните конфигурацию маппинга для двух классов, у которых отличаются два поля:
AutoMapper
configuration.CreateMap<Person, PersonViewModel>()
.ForMember(vm => vm.FullName,
o => o.MapFrom(p => $"{p.FirstName} {p.LastName}"))
.ForMember(vm => vm.Age,
o => o.MapFrom(p => Helpers.CalculateAge(p.BirthDate)))
.ForMember(vm => vm.Foo, o => o.Ignore())
.ForMember(vm => vm.Bar, o => o.UseValue(5))
FlashMapper
mappingConfiguration.CreateMapping<Person, PersonViewModel>(
p => new PersonViewModel
{
FullName = $"{p.FirstName} {p.LastName}",
Age = Helpers.CalculateAge(p.BirthDate),
Bar = 5,
Foo = MappingOptions.Ignore()
});
Данный код не только более компактный, но и более дружественен к интелисенсу.
Этот код только выглядит как создание нового экземпляра и перенос свойств вручную. На деле это лямбда-выражение, из которого компилятор c# генерит ExpressionTree, из которого в свою очередь можно получить всю нужную информацию для создания маппинга. В примере сопоставляются только различающиеся свойства. Идентичные свойства из обоих классов сопоставятся автоматически.
Да уж, жестко я опечатался, прямо в названии проекта, сборки и пакета.
Аналога ProjectTo тоже нет, но согласен, что функция это очень интересная, постараюсь ее реализовать в будущем.
Данный код не только более компактный, но и более дружественен к интелисенсу.