All streams
Search
Write a publication
Pull to refresh
4
0
Илья @Birbone

Пользователь

Send message
По первому пункту.

Заголовок спойлера
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()
    });



Данный код не только более компактный, но и более дружественен к интелисенсу.

Information

Rating
Does not participate
Location
Екатеринбург, Свердловская обл., Россия
Date of birth
Registered
Activity