😊 Маппинг ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π±Π΅Π· рСфлСксии ΠΈ Π±Π΅Π· ΠΎΠ²Π΅Ρ€Ρ…Π΅Π΄Π°

Маппинг ΠΌΠ΅ΠΆΠ΄Ρƒ модСлями это ΠΎΠ΄Π½Π° ΠΈΠ· самых скучных Π²Π΅Ρ‰Π΅ΠΉ Π² C#-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅. AutoMapper Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Π½ΠΎ тянСт Ρ€Π΅Ρ„Π»Π΅ΠΊΡΠΈΡŽ Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅. FreakyKit.Forge Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ вСсь ΠΌΠ°ΠΏΠΏΠΈΠ½Π³-ΠΊΠΎΠ΄ Π½Π° этапС компиляции Ρ‡Π΅Ρ€Π΅Π· Roslyn source generators.

Π’Ρ‹ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚Π΅ partial-ΠΌΠ΅Ρ‚ΠΎΠ΄, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΡ€ΠΈ сборкС. Никакой рСфлСксии, Π½ΠΈΠΊΠ°ΠΊΠΈΡ… зависимостСй Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅.

Установка: Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

ΠŸΠΎΠΌΠ΅Ρ‡Π°Π΅ΠΌ статичСский класс Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ [Forge] ΠΈ объявляСм ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±Π΅Π· Ρ‚Π΅Π»Π°: using FreakyKit.Forge;

public class Person { public string Name { get; set; } public int Age { get; set; } } public class PersonDto { public string Name { get; set; } public int Age { get; set; } }

[Forge] public static partial class PersonForges { public static partial PersonDto ToDto(Person source); }

ΠŸΡ€ΠΈ компиляции Forge Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ: public static partial PersonDto ToDto(Person source) { var __result = new PersonDto(); __result.Name = source.Name; __result.Age = source.Age; return __result; }

Π’Ρ‹Π·ΠΎΠ² выглядит Ρ‚Π°ΠΊ: var dto = PersonForges.ToDto(person);

ВозмоТности

Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ сцСнарий это ΠΌΠ°ΠΏΠΏΠΈΠ½Π³ ΠΏΠΎ совпадСнию ΠΈΠΌΡ‘Π½. Но Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΡƒΠΌΠ΅Π΅Ρ‚ большС.

ΠŸΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Π΅ΠΉ Ρ‡Π΅Ρ€Π΅Π· [ForgeMap]: public class Source { [ForgeMap("Name")] public string FirstName { get; set; } } public class Dest { public string Name { get; set; } }

Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ с AllowNestedForging: [Forge] public static partial class PersonForges { public static partial AddressDto ToAddressDto(Address source);

[ForgeMethod(AllowNestedForging = true)] public static partial PersonDto ToDto(Person source); } // Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚: __result.Home = ToAddressDto(source.Home);

ΠšΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ автоматичСски β€” List, T[], ImmutableArray ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. Если Ρ‚ΠΈΠΏΡ‹ элСмСнтов ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ, достаточно Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ AllowNestedForging.

ОбновлСниС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° вмСсто создания Π½ΠΎΠ²ΠΎΠ³ΠΎ β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ с двумя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΈ void: public static partial void Update(Person source, PersonDto existing); // Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚: existing.Name = source.Name; existing.Age = source.Age;

Π‘Ρ‚Ρ€ΠΎΠ³ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ для ΠΎΡ‚Π»ΠΎΠ²Π° расхоТдСний ΠΏΡ€ΠΈ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π΅: [ForgeMethod(StrictMapping = true)] public static partial PersonDto ToDto(Person source); // Если Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π΅ Π² Source ΠΈΠ»ΠΈ Dest β€” компилятор выдаст ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π½Π΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅

Π’ΠΈΠΏ-ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π΅Ρ€Ρ‹ для нСсовмСстимых Ρ‚ΠΈΠΏΠΎΠ²: [ForgeConverter] public static string ConvertDateTime(DateTime value) => value.ToString("yyyy-MM-dd"); // Forge сам Π½Π°ΠΉΠ΄Ρ‘Ρ‚ подходящий ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π΅Ρ€ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ Π΅Π³ΠΎ ΠΏΡ€ΠΈ ΠΌΠ°ΠΏΠΏΠΈΠ½Π³Π΅

Диагностика

ΠŸΠ°ΠΊΠ΅Ρ‚ FreakyKit.Forge.Analyzers добавляСт 35 диагностичСских ΠΏΡ€Π°Π²ΠΈΠ». Ошибки Π² ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ… ΠΌΠ°ΠΏΠΏΠΈΠ½Π³ΠΎΠ² Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ прямо Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ ΠΏΡ€ΠΈ сборкС, Π° Π½Π΅ Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅.

➑️ Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ

πŸ“ Навигация: Вакансии β€’ Π—Π°Π΄Π°Ρ‡ΠΈ β€’ БобСсы 🐸 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΡˆΠ°Ρ€ΠΏΠΈΡΡ‚Π°

#sharp_view


Π’ этом постС Π±Ρ‹Π»ΠΈ ссылки, Π½ΠΎ ΠΌΡ‹ ΠΈΡ… ΡƒΠ΄Π°Π»ΠΈΠ»ΠΈ ΠΏΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ Π‘Π΅Ρ‚ΠΊΠΈ