Как и зачем я сделал свой маппер
#dotnet #csharp #sourcegenerator
✅
Незаполненное поле в цели маппинга должно ломать сборку, а не молча уезжать в прод как default.
📈
Изменение модели ломает билд, а не отдаёт пользователям `0001-01-01T00:00:00` вместо реальной даты.
🔧 `required` не спасает с рантайм-мапперами: AutoMapper, Mapster создают объекты через рефлексию мимо object initializer, поэтому CS9035 не срабатывает. Ловит только Mapperly, генерирующий настоящий object initializer.
⚡ FusionMapper совмещает source generator и рантайм-фоллбек: где типы известны на компиляции — работают C# Interceptors (ошибка сборки при незаполненном required), где типы приходят из generic-кода — маппинг строится в рантайме на первом вызове.
Читаем:
Разбор, почему интерсепторы нельзя применять внутри expression tree и как это ломало компилятор без сообщения об ошибке, плюс бенчмарки против ручного маппинга, Mapperly, Mapster и AutoMapper на плоских и вложенных графах.
https://habr.com/ru/articles/1087338/
@aStateOfNet
#dotnet #csharp #sourcegenerator
✅
Незаполненное поле в цели маппинга должно ломать сборку, а не молча уезжать в прод как default.
📈
Изменение модели ломает билд, а не отдаёт пользователям `0001-01-01T00:00:00` вместо реальной даты.
🔧 `required` не спасает с рантайм-мапперами: AutoMapper, Mapster создают объекты через рефлексию мимо object initializer, поэтому CS9035 не срабатывает. Ловит только Mapperly, генерирующий настоящий object initializer.
⚡ FusionMapper совмещает source generator и рантайм-фоллбек: где типы известны на компиляции — работают C# Interceptors (ошибка сборки при незаполненном required), где типы приходят из generic-кода — маппинг строится в рантайме на первом вызове.
Читаем:
Разбор, почему интерсепторы нельзя применять внутри expression tree и как это ломало компилятор без сообщения об ошибке, плюс бенчмарки против ручного маппинга, Mapperly, Mapster и AutoMapper на плоских и вложенных графах.
https://habr.com/ru/articles/1087338/
@aStateOfNet