π ΠΠ°ΠΏΠΏΠΈΠ½Π³ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π±Π΅Π· ΡΠ΅ΡΠ»Π΅ΠΊΡΠΈΠΈ ΠΈ Π±Π΅Π· ΠΎΠ²Π΅ΡΡ Π΅Π΄Π°
ΠΠ°ΠΏΠΏΠΈΠ½Π³ ΠΌΠ΅ΠΆΠ΄Ρ ΠΌΠΎΠ΄Π΅Π»ΡΠΌΠΈ ΡΡΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· ΡΠ°ΠΌΡΡ ΡΠΊΡΡΠ½ΡΡ Π²Π΅ΡΠ΅ΠΉ Π² 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 Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΏΡΠ°Π²ΠΈΠ». ΠΡΠΈΠ±ΠΊΠΈ Π² ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡΡ ΠΌΠ°ΠΏΠΏΠΈΠ½Π³ΠΎΠ² Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ ΠΏΡΡΠΌΠΎ Π² ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ΅ ΠΏΡΠΈ ΡΠ±ΠΎΡΠΊΠ΅, Π° Π½Π΅ Π² ΡΠ°Π½ΡΠ°ΠΉΠΌΠ΅.
β‘οΈ Π Π΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ
π ΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ: ΠΠ°ΠΊΠ°Π½ΡΠΈΠΈ β’ ΠΠ°Π΄Π°ΡΠΈ β’ Π‘ΠΎΠ±Π΅ΡΡ πΈ ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΠ°ΡΠΏΠΈΡΡΠ°
Π ΡΡΠΎΠΌ ΠΏΠΎΡΡΠ΅ Π±ΡΠ»ΠΈ ΡΡΡΠ»ΠΊΠΈ, Π½ΠΎ ΠΌΡ ΠΈΡ ΡΠ΄Π°Π»ΠΈΠ»ΠΈ ΠΏΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌ Π‘Π΅ΡΠΊΠΈ