ΠΠ΅ΡΠΎΠ΄Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ DI ΠΈ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² GO
ΠΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π΅ΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π½ΠΈΠΌΠ°ΡΡΡΡ Π²Π΅ΡΠ½ΠΎ: ΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° ΠΎΠ³ΠΎΠ½Ρ, ΡΠΈΠΊΡΠΈΡΡ Π±Π°Π³ΠΈ Π² Π»Π΅Π³Π°ΡΠΈ-ΠΊΠΎΠ΄Π΅ ΠΈ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π³ΠΎΠ²ΠΎΡΠΈΡΡ ΠΎ DI - ΠΈ Π²ΡΡ ΡΠ°Π²Π½ΠΎ Π½Π΅Ρ-Π½Π΅Ρ, Π΄Π° ΠΈ Π±ΡΠ΄Π΅ΡΡ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡΡ ΡΠΎ ΡΡΡΠ°Π½Π½ΡΠΌΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌΠΈ Π² ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΡΠ·ΡΠΊΠ° GO, Π²ΠΏΡΠΎΡΠ΅ΠΌ, ΡΠΈΡΡΠ°ΡΠΈΡ ΡΡΡΡ ΡΠ»ΠΎΠΆΠ½Π΅Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ²Π½ΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΈ Π²ΡΠ΅ΠΌΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ° ΡΠ°Π±ΠΎΡΡ Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌΠΈ Π½Π΅Ρ ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΡΡΡΠΈΡ ΠΏΠ΅Π΄Π°Π»ΠΈ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΎΠ³ΠΎ ΡΠ°ΠΌΠΎΠΊΠ°ΡΠ° - Π°, Π·Π½Π°ΡΠΈΡ, Π΅ΡΡΡ ΡΡΠΎ ΠΎΠ±ΡΡΠ΄ΠΈΡΡ ΠΈ ΡΡΠ°Π²Π½ΠΈΡΡ.
Π Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Ρ ΡΠ°ΡΡΠΌΠΎΡΡΡ ΡΠ°ΠΌΡΠ΅ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Ρ Π΄Π»Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Π² go, Ρ ΠΈΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°ΠΌΠΈ ΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠ°ΠΌΠΈ. Π ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ Π²Ρ Π·Π½Π°Π΅ΡΠ΅ ΡΠ΅ΠΎΡΠΈΡ ΠΈ Π°Π±Π±ΡΠ΅Π²ΠΈΠ°ΡΡΡΠ° DI Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Ρ Π²Π°Ρ Π²ΠΎΠΏΡΠΎΡΠΎΠ² (Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π°), ΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΡΠΈΠ½Π°ΡΡ ΡΠΈΡΠ°ΡΡ ΡΡΠ°ΡΡΡ Ρ ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Ρ, Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π΅ Ρ ΠΎΠ±ΡΡΡΠ½Ρ, ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ DI, Π·Π°ΡΠ΅ΠΌ ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ Π²ΠΎΠΎΠ±ΡΠ΅ ΠΈ Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ Π² Π³ΠΎ.
Π‘ΡΠΎΠΈΡ Π½Π°ΡΠ°ΡΡ Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π³Π»Π°Π²Π½ΡΠΉ Π²ΡΠ°Π³ Π²ΡΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΎΠ² ΠΈ Π³Π»Π°Π²Π½Π°Ρ ΠΏΡΠΈΡΠΈΠ½Π° ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ΅Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ - ΡΡΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ. Π’ΡΠΈΠ²ΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ Π²ΡΠ΅Π³Π΄Π° ΠΏΠΎΠ½ΡΡΠ΅Π½, Π»Π΅Π³ΠΊΠΎ Π»ΠΎΠΆΠΈΡΡΡ Π² Π³ΠΎΠ»ΠΎΠ²Ρ, ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ ΠΈ ΠΈΠ·ΡΡΠ½ΠΎ ΡΠ΅ΡΠ°Π΅ΡΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠΎΡΠΊΠΎΠΉ ΠΊΠΎΠ΄Π° ΠΈ Ρ Π½ΠΈΠΌ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡΠ²Π°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌ. ΠΠ½ΠΎΠ΅ Π΄Π΅Π»ΠΎ, ΠΊΠΎΠ³Π΄Π° Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ Π΄Π΅ΡΡΡΠΊΠΈ ΠΈ ΡΠΎΡΠ½ΠΈ ΡΡΡΡΡ (Π° ΠΈΠ½ΠΎΠ³Π΄Π° ΠΈ Π±ΠΎΠ»ΡΡΠ΅) ΡΡΡΠΎΠΊ ΠΊΠΎΠ΄Π°, ΠΈ Π²Π΅Π»ΠΈΠΊΠΎΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ βΠ΄Π²ΠΈΠΆΡΡΠΈΡ ΡΡβ ΡΠ°ΡΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΏΠ»Π΅ΡΠ°ΡΡΡΡ, Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΡΡ, Π΄Π° ΠΈ ΠΏΡΠΎΡΡΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΠ΅ΡΠ½ΠΎΠΌ ΠΌΠΈΡΠΊΠ΅, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΅ΡΡΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡΡΡ, Π½Π΅ Π·Π°Π΄Π΅Π² ΠΊΠΎΠ³ΠΎ-ΡΠΎ Π»ΠΎΠΊΡΡΠΌΠΈ. ΠΠ»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΠΊΠ° Π½Π΅ Π½Π°ΡΠ»ΠΎ ΠΏΡΡΠΈ Π»ΡΡΡΠ΅, ΡΠ΅ΠΌ ΡΠ°Π·Π±ΠΈΠ²Π°ΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ Π²Π΅ΡΠΈ Π½Π° ΠΏΡΠΎΡΡΡΠ΅, ΠΈΠ·ΠΎΠ»ΠΈΡΡΡ ΠΈΡ ΠΈ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Ρ ΠΏΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΡΡΠΈ. ΠΠ»ΡΡΠ΅Π²Π°Ρ Π²Π΅ΡΡ Π·Π΄Π΅ΡΡ - ΡΡΠΎ ΠΈΠ·ΠΎΠ»ΡΡΠΈΡ, ΠΏΠΎΠΊΠ° ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π΅ Π²Π»ΠΈΡΠ΅Ρ Π½Π° ΡΠΎΡΠ΅Π΄Π½ΠΈΠ΅, ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΠΎΠΏΠ°ΡΠ°ΡΡΡΡ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΡ ΡΡΡΠ΅ΠΊΡΠΎΠ² ΠΈ Π½Π΅ΡΠ²Π½ΠΎΠ³ΠΎ Π²ΠΎΠ·Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΎΠ΄Π½ΠΈΠΌ Π½Π° ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠ°Π±ΠΎΡΡ Π²ΡΠΎΡΠΎΠ³ΠΎ. ΠΠ»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ°ΠΊΠΎΠΉ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ ΠΌΡ ΡΠ΅ΡΠ°Π΅ΠΌ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ²ΡΠ·ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, ΡΠ²Π½ΠΎ ΠΎΠΏΠΈΡΠ°Π², ΠΎΡ ΡΠ΅Π³ΠΎ ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ Π·Π°Π²ΠΈΡΠΈΡ. ΠΠ° ΡΡΠΎΠΌ ΠΌΠΎΠΌΠ΅Π½ΡΠ΅ ΠΌΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΈΠ½ΡΠ΅ΠΊΡΠΈΠΈ (ΠΈΠ»ΠΈ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ) Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΡΡΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ (ΠΊΠ»Π°ΡΡ, ΡΡΡΡΠΊΡΡΡΠ°, ΠΌΠΎΠ΄ΡΠ»Ρ, etc.) Π±ΡΠ»ΠΈ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΅ΠΌΡ ΡΠ°ΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠΊΡΡΠ²Π°Ρ ΠΎΡ Π½Π΅Π³ΠΎ Π²ΡΡ ΠΈΠ·Π»ΠΈΡΠ½Π΅Π΅ Π΄Π»Ρ Π΅Π³ΠΎ ΡΠ°Π±ΠΎΡΡ ΠΈΠ»ΠΈ, ΡΠΈΡΠΈΡΡΡ Π²ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΡ: βDI - ΡΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π²Π½Π΅ΡΠ½Π΅ΠΉ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΌΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡβ.
Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΡΠ΅ΡΠ°Π΅Ρ ΡΡΠ°Π·Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°Π΄Π°Ρ:
- Π‘ΠΊΡΡΠ²Π°Π΅Ρ ΠΈΠ·Π»ΠΈΡΠ½Π΅Π΅, ΡΠΌΠ΅Π½ΡΡΠ°Ρ ΠΊΠΎΠ³Π½ΠΈΡΠΈΠ²Π½ΡΡ Π½Π°Π³ΡΡΠ·ΠΊΡ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°;
- ΠΡΠΊΠ»ΡΡΠ°Π΅Ρ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ±ΠΎΡΠ½ΡΠ΅ ΡΡΡΠ΅ΠΊΡΡ (ΡΠΎ Π΅ΡΡΡ, Π½Π΅ΡΠ²Π½ΠΎΠ΅ Π²Π»ΠΈΡΠ½ΠΈΠ΅ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π½Π° ΡΠ°Π±ΠΎΡΡ Π΄ΡΡΠ³ΠΈΡ );
- ΠΠ±ΡΡΡΠ°Π³ΠΈΡΡΠ΅Ρ ΠΎΠ΄Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΎΡ Π΄ΡΡΠ³ΠΈΡ , ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ Π»Π΅Π³ΠΊΠΎ ΠΈΡ Π·Π°ΠΌΠ΅Π½ΡΡΡ, ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ;
ΠΠ°ΠΆΠ΄ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π΄Π»Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»Π΅Π½ΠΈΡ ΡΠ²ΠΎΠ΅ΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ½ΡΡ Π·Π°Π΄Π°Ρ. ΠΡΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·:
- ΠΠ°ΠΏΡΡΠΊ - ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡΡ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠΈ ΠΏΡΠΈΠ³ΠΎΡΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΊ ΡΠ°Π±ΠΎΡΠ΅: ΡΡΠΈΡΠ°ΡΡ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π²Π½Π΅ΡΠ½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌ, ΠΎΡ ΠΊΠΎΡΠΎΡΡΡ Π·Π°Π²ΠΈΡΠΈΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ ), Π½Π°ΡΠ°ΡΡ ΡΠ»ΡΡΠ°ΡΡ ΠΏΠΎΡΡ ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅;
- Π Π°Π±ΠΎΡΠ° - Π½Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ ΡΠ²ΠΎΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΡ Π΄Π΅ΡΡΠ΅Π»ΡΠ½ΠΎΡΡΡ;
- ΠΠ°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ - ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ°ΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π½ΠΎΠ²ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ, Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°ΡΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π½Π°ΠΊΠΎΠΏΠΈΠ²ΡΠΈΠ΅ΡΡ Π·Π°Π΄Π°ΡΠΈ, ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΡΠ²ΠΎΡ Π΄Π΅ΡΡΠ΅Π»ΡΠ½ΠΎΡΡΡ, Π·Π°ΠΊΡΡΠ²Π°ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅.
ΠΡΠΈ ΡΡΠΈ ΡΠ°Π·Ρ - ΡΠΏΡΠΎΡΠ΅Π½Π½ΠΎ - ΠΈ Π΅ΡΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΠΉ ΡΠΈΠΊΠ» ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΡΠΏΠΎΠΌΠΈΠ½Π°ΡΡΡΡ ΠΎΠ½ΠΈ Π²ΠΌΠ΅ΡΡΠ΅ Ρ DI ΠΏΠΎ ΡΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½Π΅, ΡΡΠΎ ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΠΉ ΡΠΈΠΊΠ» ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ ΠΎΡΠ½ΠΎΠ²ΡΠ²Π°ΡΡΡΡ Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ΅Π·ΡΡΠ»ΠΎΠ²Π½ΠΎ, ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π²ΠΎΠΏΡΠΎΡΠΎΠ² ΠΈΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ (ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, DI) - ΡΡΠΎ Π²ΡΡ ΠΆΠ΅ Π΄Π²Π΅ ΡΠ°Π·Π½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ, Π½ΠΎ ΠΎΠ½ΠΈ ΡΠ°ΡΡΠΎ ΡΠ΅ΡΠ°ΡΡΡΡ ΠΎΠ΄Π½ΠΈΠΌΠΈ ΠΈ ΡΠ΅ΠΌΠΈ ΠΆΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ²ΡΠ·Π°Π½Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±ΠΎΠΉ, ΡΠ°ΠΊ ΡΡΠΎ Ρ ΠΏΠΎΠ·Π²ΠΎΠ»Ρ ΡΠ΅Π±Π΅ Π²ΠΎΠ»ΡΠ½ΠΎΡΡΡ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΈΡ ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎ ΡΠ΅Π»ΠΎΠ΅ Π² ΡΠ°ΠΌΠΊΠ°Ρ Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠΈ. Π’ΡΡ ΡΠ°ΠΊΠΆΠ΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Ρ ΠΊΠ°ΠΊ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°ΠΌΠΎΠ³ΠΎ DI (Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ, ΡΠ΅ΡΡΠ΅Ρ ΠΈΠ»ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ), ΡΠ°ΠΊ ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠ΅Π·ΠΎΠ»Π²ΠΈΠ½Π³Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ (DI-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΡΠ΅ΡΠ²ΠΈΡ Π»ΠΎΠΊΠ°ΡΠΎΡ, ΡΠΏ), ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠΆΠ΅ ΠΎΠ±Π»Π°Π΄Π°ΡΡ ΡΠ²ΠΎΠΈΠΌΠΈ ΠΏΠ»ΡΡΠ°ΠΌΠΈ ΠΈ ΠΌΠΈΠ½ΡΡΠ°ΠΌΠΈ, Π½ΠΎ ΡΡΠΎ ΡΠΆΠ΅ Π²ΠΎΠΏΡΠΎΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ, Π² ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠ°ΡΡΠ΅.
ΠΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ ΠΌΡ ΠΏΠΈΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎΠΉ ΠΈ ΡΠΈΠΏΠΈΡΠ½ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ JSONβΡ ΠΈΠ· ΡΠ΅ΡΠΈ, ΠΊΠ»Π°Π΄ΡΡ ΠΈΡ Π² Π±Π°Π·Ρ ΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Ρ Π½Π°Ρ Π΅ΡΡΡ:
- ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΎΠΏΠΈΡΠ°Π½ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡΡ ΡΠ»ΡΡΠ°ΡΡ ΠΈ ΠΊ ΠΊΠ°ΠΊΠΎΠΉ Π±Π°Π·Π΅ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΡΡΡΡ;
- Π‘Π΅ΡΠ²Π΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ»ΡΡΠ°Π΅Ρ ΠΏΠΎΡΡ;
- ΠΠ΅ΠΊΠΈΠΉ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡ (ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΏΡΠ» ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ) ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ ;
ΠΠ°Ρ ΠΎΡΠΈΠΌ Π»ΠΈ ΠΌΡ ΠΏΠΎΠ΄Π½ΡΡΡ ΡΠ΅ΡΠ²Π΅Ρ ΠΈΠ»ΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΊ Π±Π΄, Π΅ΡΠ»ΠΈ Ρ Π½Π°Ρ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ ΡΡΠΈΡΠ°ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ? Π£ΡΡΡΠΎΠΈΡ Π»ΠΈ Π½Π°Ρ ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ³Π΄Π° ΡΠ΅ΡΠ²Π΅Ρ ΡΠΆΠ΅ ΠΏΠΎΠ΄Π½ΡΠ»ΡΡ, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Π²ΡΡΡΠ½ΠΈΠ»ΠΎΡΡ, ΡΡΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π±Π°Π·Π° Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½Π° ΠΈ ΡΠ°ΡΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΡΠΆΠ΅ ΠΎΠΊΠ°Π·Π°Π»Π°ΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π° ΠΈ ΡΠΏΠ°Π»Π° Ρ Π·Π°ΠΊΠΎΠ½ΠΎΠΌΠ΅ΡΠ½ΡΠΌΠΈ internal server error? (ΠΈΠ»ΠΈ Π½Π°ΠΎΠ±ΠΎΡΠΎΡ, ΠΌΡ ΡΡΠΏΠ΅Π»ΠΈ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ Π² Π±Π°Π·Ρ, ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΈ ΡΠΏ, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»ΠΈ, ΡΡΠΎ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ ΠΏΠΎΡΡ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ΅Π½?) ΠΡΠ°Π²ΠΈΡΡΡ Π»ΠΈ Π½Π°ΠΌ ΡΠ°ΠΊΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ, ΡΡΠΎ ΠΏΡΠΈ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ/ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²ΠΈΡΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΡΡΠΏΠ΅Π²Π°ΡΡ Π΄ΠΎΠ±Π΅ΠΆΠ°ΡΡ Π΄ΠΎ Π½Π΅Π³ΠΎ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΡΠΈΠ±ΠΊΡ, ΠΏΠΎΡΠΎΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΡΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠΈΠ»ΠΎ ΡΠ°Π±ΠΎΡΡ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°ΠΆΠ΅ ΠΈ Π² ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΡΠ΅Π³ΠΎ-ΡΠΎ Π·Π°ΠΏΡΠΎΡΠ°)?
ΠΡΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠ΅ΡΠ°ΡΡΡΡ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΠ΅ΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ: ΡΠ½Π°ΡΠ°Π»Π° ΠΌΡ ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΏΠΎΡΠΎΠΌ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ Π±Π΄, ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΌ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅ΠΌ ΡΠ΅ΡΠ²Π΅Ρ ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅. ΠΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΆΠ΅ Π·Π°Π²Π΅ΡΠ½ΠΎΠ³ΠΎ SIGINT, Π²ΠΌΠ΅ΡΡΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠ°Π΄Π΅Π½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ½Π°ΡΠ°Π»Π° ΠΆΠ΄ΡΡ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π²ΡΠ΅Ρ ΡΠ΅ΠΊΡΡΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ², ΠΏΠΎΡΠΎΠΌ Π²ΡΠΊΠ»ΡΡΠ°Π΅Ρ ΡΠ΅ΡΠ²Π΅Ρ, ΠΏΠΎΡΠΎΠΌ Π°ΠΊΠΊΡΡΠ°ΡΠ½ΠΎ Π·Π°ΠΊΡΡΠ²Π°Π΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΌ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠ²ΠΎΡ ΡΠ°Π±ΠΎΡΡ. Π’Π°ΠΊΠΎΠ΅ "Π°ΠΊΠΊΡΡΠ°ΡΠ½ΠΎΠ΅" Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², ΠΊΡΡΠ°ΡΠΈ, Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Graceful shutdown.
Π Π΅Π°Π»ΠΈΠ·ΡΡ ΡΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΠΊΠΎΠ΄Π΅, ΠΌΡ Π±Ρ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΌΠΎΠ³Π»ΠΈ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΏΡΡΠΌΠΎ Π² ΡΠ°ΠΌΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°Ρ Π²ΡΠ·ΠΎΠ²Ρ Π΄ΡΡΠ³ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Ρ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ, Π½ΠΎ ΡΡΠΎ Π±Ρ Π½Π°ΡΡΡΠΈΠ»ΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏ Π΅Π΄ΠΈΠ½ΠΎΠΉ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΠΈ ΠΈ Π·Π°ΠΊΠΎΠ½ΠΎΠΌΠ΅ΡΠ½ΠΎ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΠ»ΠΎ Π±Ρ Π²Π΅ΡΡ Π½Π°Ρ ΠΊΠΎΠ΄ Π² ΠΎΠ³ΡΠΎΠΌΠ½ΡΡ ΠΊΡΡΡ ΡΠΏΠ°Π³Π΅ΡΡΠΈ, Π±Π΅Π· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠΎΡΠ½ΠΎ ΠΏΠΎΠ½ΡΡΡ ΡΡΠΎ ΠΈ ΠΊΠΎΠ³Π΄Π° Π²ΡΠ·ΠΎΠ²Π΅ΡΡΡ ΠΈ ΠΊΠ°ΠΊ Π²ΡΠ·ΠΎΠ² ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π°Π»ΠΎΠΆΠΈΡΡΡ Π½Π° Π²ΡΠ·ΠΎΠ² Π΄ΡΡΠ³ΠΎΠΉ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π΄Π²Π΅ ΡΠ°Π·Π½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ Π±Ρ Ρ ΠΎΡΠ΅Π»ΠΈ ΠΎΡΠ΄Π΅Π»ΠΈΡΡ Π΄ΡΡΠ³ ΠΎΡ Π΄ΡΡΠ³Π° ΠΈ ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΡΠΈΡΡ, ΠΏΡΠΈΠΌΠ΅Π½ΡΡ DI:
- Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΠ΅ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠΎ Π΅ΡΡΡ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΡΡΠΎ ΠΎΡ ΡΠ΅Π³ΠΎ Π·Π°Π²ΠΈΡΠΈΡ, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΠΈΡ Π²ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΈΠ»ΠΈ Π·Π°Π²Π΅ΡΡΠΈΡΡ, ΡΡΠΎΠ±Ρ Π½ΠΈΠΊΡΠΎ ΠΈΠ· Π½ΠΈΡ Π²Π΄ΡΡΠ³ Π½Π΅ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ», ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ Π΅ΡΡ Π½Π΅ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΌ ΠΈΠ»ΠΈ ΡΠΆΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΡΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ;
- Π Π°Π±ΠΎΡΡ ΡΠ°ΠΌΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ: ΠΎΠ½ΠΈ ΠΏΡΠΎΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ, Π²ΡΠ·ΡΠ²Π°Ρ Π½ΡΠΆΠ½ΡΠ΅ ΠΈΠΌ Π΄ΡΡΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΈ Π½Π΅ ΠΎΡΠ²Π΅ΡΠ°Ρ Π·Π° Π²ΠΎΠΏΡΠΎΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΏΡΠΎΠ³ΡΠ΅Π²Π° ΠΈΠ»ΠΈ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ;
ΠΡΠ»ΠΈ Π²Π°Ρ ΠΊΠΎΠ΄ Π½Π΅ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠΎ ΠΎΠ½ Π±Π΅Π·ΡΡΠ»ΠΎΠ²Π½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΎΡΡΠΎΡΡΡ ΠΈΠ· Π½Π°Π±ΠΎΡΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², ΠΏΠΎΡΡΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ Π±ΡΠ΄Π΅Ρ ΡΡΠ΅Π±ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΠ²ΠΎΠ΅ΠΉ ΡΠ°Π±ΠΎΡΡ ΠΊΠ°ΠΊΠΈΡ -ΡΠΎ Π΄ΡΡΠ³ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ². Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, Π²Ρ Π²ΡΡ ΡΠ°Π²Π½ΠΎ Π±ΡΠ΄Π΅ΡΠ΅ ΡΠ΅ΡΠ°ΡΡ Π²ΡΡ ΡΠ΅ ΠΆΠ΅ Π·Π°Π΄Π°ΡΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌΠΈ, ΡΠΎΠ»ΡΠΊΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ»ΠΈ ΠΌΠ΅Π½Π΅Π΅ ΡΠ²Π½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ. Π ΡΠΎΠ²ΡΠ΅ΠΌ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΡ ΡΠ΅ΡΠ²ΠΈΡΠ°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π½Π΅ ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈ Π»ΡΠ±ΡΠ΅ Π²ΠΎΠΏΡΠΎΡΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ ΡΠ²Π»ΡΡΡΡΡ ΡΠ΅ΠΌ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ ΠΏΠΎΡΡΠ΄ΠΊΠ° Π½Π° Π²Π°ΡΠ΅ΠΌ ΡΡΠΎΠ»Π΅: ΡΠΊΠΎΡΠ΅Π΅ Π²ΠΎΠΏΡΠΎΡΡ Π»ΠΈΡΠ½ΠΎΠΉ Π³ΠΈΠ³ΠΈΠ΅Π½Ρ ΠΈ ΡΡΠ²ΡΡΠ²Π° ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎΠ³ΠΎ, ΡΠ΅ΠΌ ΠΆΠΈΠ·Π½Π΅Π½Π½Π°Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ. ΠΠΎ ΡΡΡ Π½ΡΠΆΠ½ΠΎ ΡΡΠ΅ΡΡΡ ΠΏΠ°ΡΡ Π½ΡΠ°Π½ΡΠΎΠ²: Π²ΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , Π½Π°Π½ΠΎΡΠ΅ΡΠ²ΠΈΡΡ Π²ΠΏΠΎΠ»Π½Π΅ Π·Π°ΡΠ»ΡΠΆΠ΅Π½Π½ΠΎ ΡΡΠΈΡΠ°ΡΡΡΡ Π°Π½ΡΠΈΠΏΠ°ΡΡΠ΅ΡΠ½ΠΎΠΌ (Π°, ΡΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ Ρ Π²Π°Ρ Π² ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ΅ Π²ΡΡ-ΡΠ°ΠΊΠΈ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°), Π²ΠΎ-Π²ΡΠΎΡΡΡ , ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π²ΡΠ΅Π³Π΄Π° ΡΡΡΠ΅ΠΌΡΡΡΡ ΠΊ ΡΡΠ»ΠΎΠΆΠ½Π΅Π½ΠΈΡ ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° ΠΊ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ (ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π»ΡΠ±ΠΎΠΉ Π½Π°Π½ΠΎΡΠ΅ΡΠ²ΠΈΡ ΡΠ΅ΠΉΡΠ°Ρ Π²ΡΡ ΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ Ρ ΠΎΡΠΎΡΠΈΠ΅ ΡΠ°Π½ΡΡ ΡΡΠ°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ), Π° Π² ΡΡΠ΅ΡΡΠΈΡ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΠ°Ρ "ΡΠ΅ΠΎΡΠΈΡ ΡΠ°Π·Π±ΠΈΡΡΡ ΠΎΠΊΠΎΠ½", ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ Π±Π°ΡΠ΄Π°ΠΊ, Π½Π°ΡΠ°Π²ΡΠΈΡΡ Π² ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΡ ΠΈ (ΠΊΠ°Π·Π°Π»ΠΎΡΡ Π±Ρ) Π½Π΅Π²Π°ΠΆΠ½ΡΡ ΡΠ°ΡΡΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΡΡΡΠ΅ΠΌΠΈΡΡΡ ΠΊ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΡ Π² Π΄ΡΡΠ³ΠΈΠ΅ ΠΈ ΠΌΠΎΡΠ°Π»ΡΠ½ΠΎ ΠΎΠ±Π»Π΅Π³ΡΠ°Π΅Ρ Π·Π°Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π±Π°ΡΠ΄Π°ΠΊΠ° Π² Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΡΡ ΡΠ°ΡΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠΎΡΡΠΎΠΌΡ Π»ΠΈΡΠ½ΠΎ Ρ Π±Ρ ΡΠΊΠ°Π·Π°Π», ΡΡΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΡΠ΄ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ½ΡΡ ΠΏΡΠ°ΠΊΡΠΈΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΡΡΠΎΡΡ, Π΅ΡΠ»ΠΈ Π½Π°ΡΠ°ΡΡ ΠΈΡ ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ Π½Π° ΡΡΠ°ΡΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π° ΠΈΡ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ Π²ΡΠ·ΠΎΠ²Π΅Ρ Ρ Π²Π°Ρ Π±ΠΎΠ»ΡΡΡΡ Π±ΠΎΠ»Ρ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΉ ΡΠ΅ΡΠ²ΠΈΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΡΠ°ΡΡΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ³Π΄Π° Π²Ρ Π·Π°Ρ ΠΎΡΠΈΡΠ΅ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ΅ΡΡΡ ΠΈ Π·Π°ΠΌΠΎΠΊΠ°ΡΡ ΠΏΠ°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², ΠΈΠ»ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π΄ΡΡΠ³ΠΈΠΌ.
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΡΠΌ ΠΊ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅.
ΠΠ°Π½Π½Π°Ρ ΡΡΠ°ΡΡΡ Π½Π΅ ΠΏΡΠ΅ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ΅Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΈΡΡΠ΅ΡΠΏΡΠ²Π°ΡΡΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΏΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌ ΠΈ ΡΡΠΈΠ»ΠΈΡΠ°ΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠ½ΠΎΠΉ Π±ΡΠ»ΠΈ Π²ΡΠ±ΡΠ°Π½Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΡΠΏΡΠΎΡΠ΅Π½Π½ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΊΠΎΠ΄Π°, ΠΏΡΠΎΡΡΠΎ ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΡΠ°Π»ΡΠ½ΡΡ ΡΠ°Π·Π½ΠΈΡΡ Π² ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π°Ρ . ΠΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, Π²ΡΠ΅ ΡΠΏΠΎΠΌΡΠ½ΡΡΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΡΠΌΠ΅ΡΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°ΠΌΠΈ ΠΈ ΠΎΠ±Π»Π°Π΄Π°ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π² ΠΈΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΊΠΎΠ΄Π° Π΄ΠΎΡΡΡΠΏΠ½Ρ Π½Π° https://github.com/vivid-money/article-golang-di.
ΠΠ»Ρ Π²ΡΠ΅Ρ
ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² Ρ Π±ΡΠ΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΡΠ΅Π½ΡΠΊΡΡ ΠΈΠ΅ΡΠ°ΡΡ
ΠΈΡ, ΡΠΎΡΡΠΎΡΡΡΡ ΠΈΠ· ΡΡΠ΅Ρ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², Logger - ΡΡΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΉ ΠΏΠΎΠ΄ Π»ΠΎΠ³Π³Π΅Ρ ΠΈΠ· ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, DBConn Π±ΡΠ΄Π΅Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ
, Π° HTTPServer, Π»ΠΎΠ³ΠΈΡΠ½ΠΎ, ΡΠ΅ΡΠ²Π΅Ρ, ΡΠ»ΡΡΠ°ΡΡΠΈΠΉ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΉ ΠΏΠΎΡΡ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠΈΠΉ Π½Π΅ΠΊΠΈΠΉ (ΡΠ΅ΠΉΠΊΠΎΠ²ΡΠΉ) Π·Π°ΠΏΡΠΎΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ
. Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΈ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ Logger->DBConn->HTTPServer, Π° Π·Π°Π²Π΅ΡΡΠ°ΡΡΡΡ Π² ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅.
ΠΠ»Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΈ ΡΠ°Π±ΠΎΡΡ Ρ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΌΠΈΡΡ ΠΈ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ±ΡΠΈΠΌΠΈΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ, DBConn Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ (ΠΏΡΠΎΡΡΠΎ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π²ΡΠ·Π²Π°ΡΡ DBConn.Connect()
), Π° httpServer.Serve
, Π½Π°ΠΏΡΠΎΡΠΈΠ², Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
ΠΠ°ΡΠ½ΡΠΌ Ρ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΠΎΠ³ΠΎ Π² Π΄ΡΡΠ³ΠΈΡ ΡΠ·ΡΠΊΠ°Ρ Π²Π°ΡΠΈΠ°Π½ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π² ΠΌΠΈΡΠ΅ Π³ΠΎ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ ΠΏΠ°ΠΊΠ΅ΡΠ°ΠΌΠΈ https://github.com/uber-go/dig ΠΈ ΡΠ°ΡΡΠΈΡΡΡΡΠΈΠΌ Π΅Π³ΠΎ https://github.com/uber-go/fx. ΠΠ΄Π΅Ρ ΠΏΡΠΎΡΡΠ°, Π³ΡΠ°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠΏΠΈΡΠ°ΡΡ Π² ΡΠ°Π½ΡΠ°ΠΉΠΌΠ΅, ΡΠ°ΠΌ ΠΆΠ΅ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΈΠ· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠ²ΡΠ·Π°ΡΡ Ρ ΡΠΊΠΈ Π½Π° ΡΡΠ°ΡΡ ΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ. ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΡΡΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π½Π° ΠΏΡΠΎΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅:
// ΠΠΎΠ³Π³Π΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π·Π°ΡΠ°Π½Π΅Π΅, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΡΠΎ-ΡΠΎ Π½ΡΠΆΠ½ΠΎ ΠΏΠΈΡΠ°ΡΡ Π² Π»ΠΎΠ³ΠΈ ΡΡΠ°Π·Ρ, Π΅ΡΡ Π΄ΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π³ΡΠ°ΡΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ.
logger := log.New(os.Stderr, "", 0)
logger.Print("Started")
container := dig.New() // ΡΠΎΠ·Π΄Π°ΡΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ
// Π Π΅Π³ΠΈΡΡΡΠΈΡΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ.
// Dig Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅ΡΠ»Π΅ΠΊΡΠΈΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎ ΡΠΈΠ³Π½Π°ΡΡΡΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΠ½ΡΡΡ, ΡΡΠΎ ΠΎΠ½Π° ΡΠΎΠ·Π΄Π°ΡΡ ΠΈ ΡΡΠΎ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΡΠ΅Π±ΡΠ΅Ρ.
_ = container.Provide(func() components.Logger {
logger.Print("Provided logger")
return logger // ΠΡΠΎΠΊΠΈΠ½ΡΠ»ΠΈ ΡΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Π»ΠΎΠ³Π³Π΅Ρ.
})
_ = container.Provide(components.NewDBConn)
_ = container.Provide(components.NewHTTPServer)
_ = container.Invoke(func(_ *components.HTTPServer) {
// ΠΡΠ·Π²Π°Π»ΠΈ HTTPServer, ΠΊΠ°ΠΊ "ΠΊΠΎΡΠ΅Π½Ρ" Π³ΡΠ°ΡΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ³ΡΡΠ·ΠΈΠ»ΠΎΡΡ Π²ΡΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΠ΅.
logger.Print("Can work with HTTPServer")
// ΠΠΈΠΊΠ°ΠΊΠΈΡ
ΡΡΠ΅Π΄ΡΡΠ² Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΠΌ ΡΠΈΠΊΠ»ΠΎΠΌ Π½Π΅Ρ, ΠΏΡΠΈΡΠ»ΠΎΡΡ Π±Ρ Π²ΡΡ ΠΏΠΈΡΠ°ΡΡ Π²ΡΡΡΠ½ΡΡ.
})
/*
Output:
---
Started
Provided logger
New DBConn
New HTTPServer
Can work with HTTPServer
*/
Π’Π°ΠΊΠΆΠ΅ fx ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Ρ ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΠΌ ΡΠΈΠΊΠ»ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// ΠΠΎΠ³Π³Π΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π·Π°ΡΠ°Π½Π΅Π΅, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΡΠΎ-ΡΠΎ Π½ΡΠΆΠ½ΠΎ ΠΏΠΈΡΠ°ΡΡ Π² Π»ΠΎΠ³ΠΈ ΡΡΠ°Π·Ρ, Π΅ΡΡ Π΄ΠΎ
// ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π³ΡΠ°ΡΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ.
logger := log.New(os.Stderr, "", 0)
logger.Print("Started")
// ΠΠ° ΡΡΠΎΡ ΡΠ°Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ fx, Π·Π΄Π΅ΡΡ ΡΠΆΠ΅ Ρ Π½Π°Ρ ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ "ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ".
app := fx.New(
fx.Provide(func() components.Logger {
return logger // ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π»ΠΎΠ³Π³Π΅Ρ ΠΊΠ°ΠΊ Π²Π½Π΅ΡΠ½ΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ.
}),
fx.Provide(
func(logger components.Logger, lc fx.Lifecycle) *components.DBConn { // ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΅ΡΡ ΠΈ lc - ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΠΉ ΡΠΈΠΊΠ».
conn := components.NewDBConn(logger)
// ΠΠΎΠΆΠ½ΠΎ Π½Π°Π²Π΅ΡΠΈΡΡ Ρ
ΡΠΊΠΈ.
lc.Append(fx.Hook{
OnStart: func(ctx context.Context) error {
if err := conn.Connect(ctx); err != nil {
return fmt.Errorf("can't connect to db: %w", err)
}
return nil
},
OnStop: func(ctx context.Context) error {
return conn.Stop(ctx)
},
})
return conn
},
func(logger components.Logger, dbConn *components.DBConn, lc fx.Lifecycle) *components.HTTPServer {
s := components.NewHTTPServer(logger, dbConn)
lc.Append(fx.Hook{
OnStart: func(_ context.Context) error {
go func() {
defer cancel()
// ΠΡΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΠ΅ΡΠ²Π΅Ρ, Ρ.ΠΊ. Serve - Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ.
if err := s.Serve(context.Background()); err != nil && !errors.Is(err, http.ErrServerClosed) {
logger.Print("Error: ", err)
}
}()
return nil
},
OnStop: func(ctx context.Context) error {
return s.Stop(ctx)
},
})
return s
},
),
fx.Invoke(
// ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ - "Π»Π΅Π½ΠΈΠ²ΡΠ΅", ΡΠ°ΠΊ ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°ΡΡ ΠΊΠΎΡΠ΅Π½Ρ Π³ΡΠ°ΡΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ³ΡΡΠ·ΠΈΠ»ΠΎΡΡ Π²ΡΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΠ΅.
func(*components.HTTPServer) {
go func() {
components.AwaitSignal(ctx) // ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ ΡΠΈΠ³Π½Π°Π»Π°, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
cancel()
}()
},
),
fx.NopLogger,
)
_ = app.Start(ctx)
<-ctx.Done() // ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π»Π°
_ = app.Stop(context.Background())
/*
Output:
---
Started
New DBConn
New HTTPServer
Connecting DBConn
Connected DBConn
Serving HTTPServer
^CStop HTTPServer
Stopped HTTPServer
Stop DBConn
Stopped DBConn
*/
ΠΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ Π²ΠΎΠΏΡΠΎΡ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π»ΠΈ ΠΌΠ΅ΡΠΎΠ΄ Serve Π±ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΌ (ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ Ρ ListenAndServe) ΠΈΠ»ΠΈ Π½Π΅Ρ? ΠΠΎΡ ΡΠΎΡΠΊΠ° Π·ΡΠ΅Π½ΠΈΡ Π½Π° ΡΡΠΎ ΠΏΡΠΎΡΡΠ°: ΡΠ΄Π΅Π»Π°ΡΡ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΌ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ (go blockingFunc()
), Π° Π²ΠΎΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ΅ ΠΎΡΠ΅Π½Ρ ΡΠ»ΠΎΠΆΠ½ΠΎ. Π’Π°ΠΊ ΠΊΠ°ΠΊ Π»ΡΠ±ΠΎΠΉ ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ ΠΎΠ±Π»Π΅Π³ΡΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠ΅ΠΌ, ΠΊΡΠΎ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ, Π»ΠΎΠ³ΠΈΡΠ½Π΅Π΅ Π²ΡΠ΅Π³ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠΉ ΠΊΠΎΠ΄, Π° Π°ΡΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠΌ Π΅Π³ΠΎ ΠΏΡΡΡΡ ΡΠ΄Π΅Π»Π°Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ, Π΅ΡΠ»ΠΈ Π΅ΠΌΡ ΡΡΠΎ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ.
ΠΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡ ΠΊ fx, Π² ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΡΠ»ΠΎΠΆΠ½ΡΡ
ΡΠΈΡΡΠ°ΡΠΈΡΡ
ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·Π½ΡΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΡΠΈΠΏΡ (fx.In
, fx.Out
ΠΈ ΡΠ΄) ΠΈ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ (optional
, name
ΠΈ ΡΠ΄), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌ, Π·Π°Π²ΠΈΡΡΡΠΈΠΌ ΠΎΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΡ
ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ², ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΈΠ»ΠΈ ΠΏΡΠΎΡΡΠΎ ΡΠ²ΡΠ·ΡΠ²Π°ΡΡ ΡΡΠΎ-ΡΠΎ ΠΏΠΎ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠΌ ΠΈΠΌΠ΅Π½Π°ΠΌ.
Π’Π°ΠΊΠΆΠ΅ Π΄ΠΎΡΡΡΠΏΠ½Ρ Ρ
Π΅Π»ΠΏΠ΅ΡΡ, Π΄Π°ΡΡΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, fx.Supply
ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΡΠΆΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π² ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΏΡΠΈΡΠΈΠ½Π΅ Π½Π΅ Ρ
ΠΎΡΠΈΡΠ΅ Π΅Π³ΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ°ΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, Π½ΠΎ Ρ
ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π΄Π»Ρ Π΄ΡΡΠ³ΠΈΡ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ².
Π’Π°ΠΊΠΎΠΉ "Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ" ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ ΡΠ²ΠΎΠΈ ΠΏΠ»ΡΡΡ:
- ΠΠ΅Ρ Π½ΡΠΆΠ΄Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΏΠΎΡΡΠ΄ΠΎΠΊ, ΠΌΡ ΠΏΡΠΎΡΡΠΎ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ, Π° ΠΏΠΎΡΠΎΠΌ ΠΎΠ±ΡΠ°ΡΠ°Π΅ΠΌΡΡ ΠΊ Π½ΡΠΆΠ½ΡΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°ΠΌ ΠΈ Π²ΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ, "Π²ΠΎΠ»ΡΠ΅Π±Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ". Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΠΏΡΠΎΡΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π½ΠΎΠ²ΡΠΉ ΠΊΠΎΠ΄;
- ΠΠ° ΡΡΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ Π³ΡΠ°ΡΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, Π»Π΅Π³ΠΊΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΠΌΠ΅Π½ΡΡΡ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ ΡΠ°ΡΡΠΈ Π½Π° ΠΌΠΎΠΊΠΈ, ΡΠ°ΠΊ ΠΈ Π²ΠΎΠ²ΡΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠ°ΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ;
- ΠΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠ±ΡΠ΅ Π²Π½Π΅ΡΠ½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΏΡΠΎΡΡΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΠΈΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ;
- ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΈΡΠ°ΡΡ ΠΌΠ΅Π½ΡΡΠ΅ ΠΊΠΎΠ΄Π°;
- ΠΠ΅ ΡΡΠ΅Π±ΡΠ΅Ρ xml ΠΈΠ»ΠΈ yaml;
ΠΠΈΠ½ΡΡΡ:
- ΠΠΎΠ»ΡΡΠ΅ ΠΌΠ°Π³ΠΈΠΈ, ΡΠ»ΠΎΠΆΠ½Π΅Π΅ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡΡΡ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ;
- ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ, Π² ΡΠ°Π½ΡΠ°ΠΉΠΌΠ΅, ΡΠΎ ΠΌΡ ΡΠ΅ΡΡΠ΅ΠΌ compile-time Π³Π°ΡΠ°Π½ΡΠΈΠΈ - ΡΠ·Π½Π°ΡΡ ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°Ρ Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π°Π±ΡΠ»ΠΈ ΡΡΠΎ-ΡΠΎ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ) ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΏΡΡΡΠΈΠ² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈΠ½ΠΎΠ³Π΄Π° Π² ΠΎΡΠΎΠ±ΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ. ΠΡΡΠ°ΡΡΠΈ Π½Π°Π΄ΡΠΆΠ½ΠΎΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΠΏΠΎΠ²ΡΡΠΈΡΡ ΡΠ΅ΡΡΠ°ΠΌΠΈ, Π½ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π³Π°ΡΠ°Π½ΡΠΈΠΉ ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π²ΡΡ ΡΠ°Π²Π½ΠΎ Π½Π΅ Π΄Π°ΡΡ.
- ΠΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ Π΄Π»Ρ fx:
-
- ΠΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² (ΠΊΠΎΠ³Π΄Π° Serve Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ), ΠΏΡΠΈΠ΄ΡΡΡΡ ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΠΈ Π²Π΅Π»ΠΎΡΠΈΠΏΠ΅Π΄Ρ, Π±Π»Π°Π³ΠΎ, ΡΡΠΎ Π΄Π΅Π»ΠΎ Π½Π΅ ΡΠ°ΠΌΠΎΠ΅ ΡΠ»ΠΎΠΆΠ½ΠΎΠ΅;
ΠΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ ΠΎΡΠ½ΠΎΠ²ΡΠ²Π°ΡΡΡΡ Π½Π° ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΈ ΠΏΠ΅ΡΠ²ΡΠΌ ΠΈΠ· Π½ΠΈΡ Π½Π° ΡΠΌ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅ΡΠ°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π² go ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ https://github.com/google/wire Π·Π° Π°Π²ΡΠΎΡΡΡΠ²ΠΎΠΌ Π²ΡΠ΅ΠΌ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ. ΠΠ· ΡΠ°ΠΌΠΎΠ³ΠΎ Π½Π°Π·Π²Π°Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ, ΡΡΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ΅Π·ΠΎΠ»Π²ΠΈΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ, ΠΌΡ ΡΠ³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ ΡΠ²Π½ΡΠΉ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΈ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΠ΄. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ±ΠΊΠΈ Π½Π° ΡΡΠΎΠ²Π½Π΅ Π³ΡΠ°ΡΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΎΠ½ ΠΈΠ»ΠΈ Π½Π΅ ΡΠ³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ, ΠΈΠ»ΠΈ Π½Π΅ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ compile-time Π³Π°ΡΠ°Π½ΡΠΈΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ. ΠΡΠΈ ΡΠ°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π΅ Π²Π΅ΡΡ Π²ΠΎΠΏΡΠΎΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ Π½Π°Ρ Π³ΡΠ°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΎΠΌ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π½Π΅Π³ΠΎ ΠΊΠΎΠ΄. Π ΡΠ°Π·Π½ΡΡ ΡΠ·ΡΠΊΠ°Ρ Π΄Π»Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠ²ΡΠ·Π΅ΠΉ Π² ΠΊΠΎΠ΄Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π°, ΠΎΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ Π΄ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ², Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΠΌΠΈΡΠ΅ Π³ΠΎ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, Π° ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ - ΡΡΠΎ Π²Π΅ΡΡ ΠΎΡΠ΅Π½Ρ ΡΠΏΠΎΡΠ½Π°Ρ ΠΈ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΌΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠ°ΠΌΠΈ, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π² ΠΈΡΠΎΠ³Π΅ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈΡΡ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠ΄ΠΎΠΌ. ΠΡΠ³Π»ΡΠ΄ΠΈΡ ΡΡΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
Π Π½Π°ΡΠ°Π»Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΠΈΡΠ°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ Π΄Π»Ρ Π½ΠΈΡ , ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ. ΠΠ°ΡΠ΅ΠΌ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΠΌΡ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ ΠΏΠΎΠ΄ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΌ Π±ΠΈΠ»Π΄-ΡΠ΅Π³ΠΎΠΌ (ΡΡΠΎΠ±Ρ ΠΊΠΎΠ΄ Π½Π΅ ΠΏΠΎΠΏΠ°Π» Π² ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ ΡΠΆΠ΅ "Π±ΠΎΠ΅Π²ΠΎΠ³ΠΎ" ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΎ ΠΎΡΠΈΠ±ΠΎΠΊ, ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ):
// +build wireinject
package main
import (
"context"
"github.com/google/wire"
"github.com/vivid-money/article-golang-di/pkg/components"
)
func initializeHTTPServer(
_ context.Context,
_ components.Logger,
closer func(), // ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ·ΠΎΠ²Π΅Ρ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΡ Π²ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
) (
res *components.HTTPServer,
cleanup func(), // ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
err error,
) {
wire.Build(
NewDBConn,
NewHTTPServer,
)
return &components.HTTPServer{}, nil, nil
}
Π ΠΈΡΠΎΠ³Π΅, ΠΏΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½ΠΎΠΉ ΡΡΠΈΠ»ΠΈΡΡ wire
(ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΡΠ΅ΡΠ΅Π· go generate
), wire ΠΏΡΠΎΡΠΊΠ°Π½ΠΈΡΡΠ΅Ρ Π²Π°Ρ ΠΊΠΎΠ΄, Π½Π°ΠΉΠ΄ΡΡ Π²ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ wire ΠΈ ΡΠ³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠ°ΠΉΠ» Ρ ΠΊΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡ Π²ΡΠ΅ ΠΈΠ½ΠΆΠ΅ΠΊΡΡ:
func initializeHTTPServer(contextContext context.Context, logger components.Logger, closer func()) (*components.HTTPServer, func(), error) {
dbConn, cleanup, err := NewDBConn(contextContext, logger)
if err != nil {
return nil, nil, err
}
httpServer, cleanup2 := NewHTTPServer(contextContext, logger, dbConn, closer)
return httpServer, func() {
cleanup2()
cleanup()
}, nil
}
Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠ°Π·Ρ ΠΆΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡ initializeHTTPServer
ΠΏΡΠΈ ΡΡΠ°ΡΡΠ΅ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈ "ΠΏΡΠΎΠΊΠΈΠ½Π΅Ρ" ΠΊΡΠ΄Π° Π½Π°Π΄ΠΎ Π²ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ:
package main
//go:generate wire
import (
"context"
"fmt"
"log"
"os"
"errors"
"net/http"
"github.com/vivid-money/article-golang-di/pkg/components"
)
// ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ wire Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ lifecycle (ΡΠΎΡΠ½Π΅Π΅, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Cleanup-ΡΡΠ½ΠΊΡΠΈΠΈ), Π° ΠΌΡ Π½Π΅ Ρ
ΠΎΡΠΈΠΌ
// Π΄Π΅Π»Π°ΡΡ Π²ΡΠ·ΠΎΠ²Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π² Π½ΡΠΆΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΡΡΠΊΠ°ΠΌΠΈ, ΡΠΎ ΠΏΡΠΈΠ΄ΡΡΡΡ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ Π²ΡΠ°ΠΏΠΏΠ΅ΡΡ Π΄Π»Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠ²,
// ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΈ ΡΡΠΎΠΌ Π±ΡΠ΄ΡΡ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π½Π°ΡΠΈΠ½Π°ΡΡ ΡΠ°Π±ΠΎΡΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ cleanup-ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ Π΅Π³ΠΎ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ.
func NewDBConn(ctx context.Context, logger components.Logger) (*components.DBConn, func(), error) {
conn := components.NewDBConn(logger)
if err := conn.Connect(ctx); err != nil {
return nil, nil, fmt.Errorf("can't connect to db: %w", err)
}
return conn, func() {
if err := conn.Stop(context.Background()); err != nil {
logger.Print("Error trying to stop dbconn", err)
}
}, nil
}
func NewHTTPServer(
ctx context.Context,
logger components.Logger,
conn *components.DBConn,
closer func(),
) (*components.HTTPServer, func()) {
srv := components.NewHTTPServer(logger, conn)
go func() {
if err := srv.Serve(ctx); err != nil && !errors.Is(err, http.ErrServerClosed) {
logger.Print("Error serving http: ", err)
}
closer()
}()
return srv, func() {
if err := srv.Stop(context.Background()); err != nil {
logger.Print("Error trying to stop http server", err)
}
}
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// ΠΠΎΠ³Π³Π΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π·Π°ΡΠ°Π½Π΅Π΅, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΡΠΎ-ΡΠΎ Π½ΡΠΆΠ½ΠΎ ΠΏΠΈΡΠ°ΡΡ Π² Π»ΠΎΠ³ΠΈ ΡΡΠ°Π·Ρ, Π΅ΡΡ Π΄ΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π³ΡΠ°ΡΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ.
logger := log.New(os.Stderr, "", 0)
logger.Print("Started")
// ΠΡΠΆΠ΅Π½ ΡΠΏΠΎΡΠΎΠ± ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ΠΈΠ»ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ±ΠΊΠΈ. ΠΠ΅ Ρ
ΠΎΡΠ΅ΡΡΡ ΠΎΡΠΌΠ΅Π½ΡΡΡ "Π³Π»Π°Π²Π½ΡΠΉ" ΠΊΠΎΠ½ΠΈΠ΅ΠΊΡΠΈ, ΡΠ°ΠΊ
// ΠΊΠ°ΠΊ ΠΎΠ½ ΠΏΡΠ΅ΠΊΡΠ°ΡΠΈΡ Π²ΡΠ΅ Server'Ρ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ, ΡΡΠΎ Π»ΠΈΡΠΈΡ ΡΠΌΡΡΠ»Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ cleanup-ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΠΎΡΡΠΎΠΌΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ
// Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π½Π° Π΄ΡΡΠ³ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅.
lifecycleCtx, cancelLifecycle := context.WithCancel(context.Background())
defer cancelLifecycle()
// ΠΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅ΠΌ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ Serve Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°Ρ
.
_, cleanup, _ := initializeHTTPServer(ctx, logger, func() {
cancelLifecycle()
})
defer cleanup()
go func() {
components.AwaitSignal(ctx) // ΠΆΠ΄ΡΠΌ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈΠ»ΠΈ ΡΠΈΠ³Π½Π°Π»Π°
cancelLifecycle()
}()
<-lifecycleCtx.Done()
/*
Output:
---
New DBConn
Connecting DBConn
Connected DBConn
New HTTPServer
Serving HTTPServer
^CStop HTTPServer
Stopped HTTPServer
Stop DBConn
Stopped DBConn
*/
}
ΠΠ»ΡΡΡ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π°:
- ΠΡΠ΅Π½Ρ ΡΠ²Π½ΡΠΉ ΠΈ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΡΠΉ ΠΊΠΎΠ΄;
- ΠΠ°ΡΠ°Π½ΠΈΠΈ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ;
- ΠΡΡ Π΅ΡΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π½ΠΈΡΠ΅Π³ΠΎ ΡΠΎΠ±ΠΈΡΠ°ΡΡ ΡΡΠΊΠ°ΠΌΠΈ;
- ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡΠΈΡΠ½ΠΎ, ΠΌΡ ΠΏΡΠΎΡΡΠΎ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π΅ΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΡ
wire.Build
; - ΠΡΡ Π΅ΡΡ Π½ΠΈΠΊΠ°ΠΊΠΈΡ xml;
- Wire ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΊΡΠΎΠΌΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π΅ΡΡ ΠΈ cleanup-ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΡΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ.
ΠΠ΄Π½Π°ΠΊΠΎ Π΅ΡΡΡ ΠΈ ΠΌΠΈΠ½ΡΡΡ:
- ΠΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ Π΄Π΅Π»Π°ΡΡ Π»ΠΈΡΠ½ΠΈΠ΅ ΡΠ΅Π»ΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ, Π΄Π°ΠΆΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π³ΡΠ°ΡΠ° ΡΠ΅ΡΠ΅Π· ΠΈΠ½ΠΆΠ΅ΠΊΡΠΎΡΡ Π²ΡΡ-ΡΠ°ΠΊΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ ΠΌΠ΅ΡΡΠΎ;
- Π’ΡΠΆΠ΅Π»Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΠ΅ΡΡΠΎΠ² ΠΈ ΠΌΠΎΠΊΠΎΠ², ΠΈΠ·-Π·Π° ΠΎΡΡΡΡΡΡΡΠ²ΠΈΡ ΡΠ²Π½ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² ΡΠ°Π±ΠΎΡΡ Ρ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠΌΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌΠΈ; ΠΡΠΎ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΡΠ΅ΡΠ°Π΅ΠΌΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ½ΠΆΠ΅ΠΊΡΠΎΠΌ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠ², Π½ΠΎ Π²ΡΡ ΡΠ°Π²Π½ΠΎ ΡΡΠ½Π΅Ρ "Π»ΠΈΡΠ½ΠΈΠ΅" ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ;
- ΠΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ Π΄Π»Ρ wire (Π½ΡΠΆΠ½ΠΎ ΡΡΠΈΡΡΠ²Π°ΡΡ, ΡΡΠΎ ΠΎΠ½ Π΅ΡΡ Π² Π±Π΅ΡΠ΅):
-
- ΠΠ΅ ΡΠΌΠ΅Π΅Ρ ΡΠΎΠΎΡΠ½ΠΎΡΠΈΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠΈΠΉ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΡ ΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, Π΅ΡΠ»ΠΈ ΠΎΠ½ ΡΡΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ;
-
- ΠΠ΅Ρ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π°, ΡΡΠΎ Π·Π°ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΅ΡΡ ΠΈ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ/ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π΅Π³ΠΎ, ΡΡΠΎ Π½Π΅ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΈ Π² ΠΎΠ±ΡΠ΅ΠΌ ΡΠΌΡΡΠ»Π΅, ΠΈ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠ² ΠΈΠ· Π²Π½Π΅ΡΠ½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ;
-
- ΠΠΎ ΡΠΎΠΉ ΠΆΠ΅ ΠΏΡΠΈΡΠΈΠ½Π΅ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΠΈΠ·ΠΎΠ±ΡΠ΅ΡΠ°ΡΡ ΡΠ²ΠΎΠΉ Π²Π΅Π»ΠΎΡΠΈΠΏΠ΅Π΄ Π΄Π»Ρ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΡΠ»ΡΡΠ°Π΅ "ΠΏΠ°Π΄Π΅Π½ΠΈΡ" ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²;
-
- Cleanup'ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎ ΠΏΠΎΡΡΠ΄ΠΊΡ, Π΅ΡΠ»ΠΈ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄ΡΡ ΠΏΠ°Π½ΠΈΠΊΠ°, ΡΠΎ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ Π½Π΅ Π²ΡΠ·ΠΎΠ²ΡΡΡΡ.
ΠΠ»Ρ ΠΏΡΠΈΡΠ΅Π΄ΡΠΈΡ ΠΈΠ· Π΄ΡΡΠ³ΠΈΡ ΡΠ·ΡΠΊΠΎΠ² ΡΡΠΎ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ Π·Π²ΡΡΠ°ΡΡ Π΄ΠΈΠΊΠΎ, Π½ΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π²Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½Ρ ΡΠ΅ΡΡΡΠ·Π½ΡΠ΅ ΠΈ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠΏΡΠ°Π²Π»ΡΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠΌ (ΠΈΠ»ΠΈ Π±ΠΎΠ»ΡΡΠΈΠΌ, Π½ΠΎ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΡΠΌ) Π³ΡΠ°ΡΠΎΠΌ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ. ΠΡΠ»ΠΈ ΡΡΠΎ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΡΠΎ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π»ΡΡΡΠ΅ Π²Π·ΡΡΡ wire ΠΈΠ»ΠΈ dig/fx, Π½ΠΎ Ρ ΠΌΠΎΠ³Ρ Π²Π°Ρ ΡΠ²Π΅ΡΠΈΡΡ, ΡΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ ΡΠ°ΠΊΠΈΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠΌ Ρ Π²Π°Ρ Π±ΡΠ΄Π΅Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠ΅Π½ΡΡΠ΅, ΡΠ΅ΠΌ Π²Π°ΠΌ ΠΊΠ°ΠΆΠ΅ΡΡΡ (ΠΈΠ»ΠΈ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²ΠΎΠΎΠ±ΡΠ΅). ΠΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΏΡΠΈΡΠΈΠ½ ΡΡΠΎΠΌΡ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ Ρ Π³ΠΎΡΠ½ΠΈΠΊΠΎΠ² ΠΌΠ°Π½Π΅ΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΈΠ·Π±ΡΡΠΎΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² (Π²ΠΌΠ΅ΡΡΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ²-ΡΠ°Π±ΡΠΈΠΊ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΡΠ°Π±ΡΠΈΠΊ-Π΄Π»Ρ-ΡΠ°Π±ΡΠΈΠΊ ΠΎΠ±ΡΡΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΠΏΡΠΎΡΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ-ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ), Π΄ΡΡΠ³ΠΎΠΉ - Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π³ΠΎ.
Π’Π°ΠΊ Π²ΠΎΡ, Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ ΠΏΡΠΎΡΡΠΎΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΄Π΅Π»Π°Π΅Ρ Π²ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΈΠ½ΠΆΠ΅ΠΊΡΡ:
logger := log.New(os.Stderr, "", 0)
dbConn := components.NewDBConn(logger)
httpServer := components.NewHTTPServer(logger, dbConn)
doSomething(httpServer)
ΠΡΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΡΡΠΎ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡΠΈΡΠ½ΠΎ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ Π²ΠΎΠΎΠ±ΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Π΅Π· ΡΠ°Π½ΡΠ°ΠΉΠΌΠΎΠ²ΠΎΠΉ ΠΌΠ°Π³ΠΈΠΈ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ·ΡΠΊΠ΅, ΠΈ Π²Π°ΠΌ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΄ΠΎΡΠΎΠ³ΠΎ ΠΏΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ (Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΡΡ Π½ΠΎΠ²ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΈΠ»ΠΈ Π²ΠΎΠΎΠ±ΡΠ΅ Π½ΠΎΠ²ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ) Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΠ°ΡΡ ΡΡΡΠΎΠΊ Π² ΡΡΠΎΡ ΠΊΠΎΠ΄. ΠΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ Π·Π΄Π΅ΡΡ Π±ΡΠ΄Π΅Ρ Π² ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΠΉ ΡΠΈΠΊΠ», ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ. ΠΠ΅ΡΠ²ΡΠΌ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±, ΠΏΡΠΎ ΠΊΠΎΡΠΎΡΡΠΉ Avito ΡΠ°ΡΡΠΊΠ°Π·ΡΠ²Π°Π»ΠΈ Π²ΠΎΡ Π² ΡΡΠΎΠΌ Π΄ΠΎΠΊΠ»Π°Π΄Π΅:
ΠΡΠ³Π»ΡΠ΄ΠΈΡ ΠΎΠ½ΠΎ Π²ΠΎΡ ΡΠ°ΠΊ:
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
logger := log.New(os.Stderr, "", 0)
logger.Print("Started")
g, gCtx := errgroup.WithContext(ctx)
dbConn := components.NewDBConn(logger)
g.Go(func() error {
// dbConn ΡΠΌΠ΅Π΅Ρ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ ΠΏΠΎ ΠΎΡΠΌΠ΅Π½Π΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°.
if err := dbConn.Connect(gCtx); err != nil {
return fmt.Errorf("can't connect to db: %w", err)
}
return nil
})
httpServer := components.NewHTTPServer(logger, dbConn)
g.Go(func() error {
go func() {
// ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ httpServer (ΠΊΠ°ΠΊ ΠΈ http.ListenAndServe, ΠΊΡΡΠ°ΡΠΈ) Π½Π΅ ΡΠΌΠ΅Π΅Ρ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ ΠΏΠΎ ΠΎΡΠΌΠ΅Π½Π΅
// ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°, ΡΠΎΠ³Π΄Π° ΠΏΡΠΈΠ΄ΡΡΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΎΡΠΌΠ΅Π½Ρ Π²ΡΡΡΠ½ΡΡ.
<-gCtx.Done()
if err := httpServer.Stop(context.Background()); err != nil {
logger.Print("Stopped http server with error:", err)
}
}()
if err := httpServer.Serve(gCtx); err != nil && !errors.Is(err, http.ErrServerClosed) {
return fmt.Errorf("can't serve http: %w", err)
}
return nil
})
go func() {
components.AwaitSignal(gCtx)
cancel()
}()
_ = g.Wait()
/*
Output:
---
Started
New DBConn
New HTTPServer
Connecting DBConn
Connected DBConn
Serving HTTPServer
^CStop HTTPServer
Stop DBConn
Stopped DBConn
Stopped HTTPServer
Finished serving HTTPServer
*/
}
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ? ΠΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π²ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ Π³ΠΎΡΡΡΠΈΠ½Π°Ρ , Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π½Π΅ Π²ΡΡΡΠ½ΡΡ, Π° ΡΠ΅ΡΠ΅Π· ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ ΡΡΡΡΠΊΡΡΡΡ g, ΠΊΠΎΡΠΎΡΠ°Ρ:
- ΠΡΠ΄Π΅Ρ ΡΡΠΈΡΠ°ΡΡ Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΠ΅ ΡΠ΅ΡΠ΅Π· Π½Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ (ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΎΠΌ Π΄ΠΎΠΆΠ΄Π°ΡΡΡΡ Π²ΡΠ΅Ρ );
- ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ ΠΎΡΠΌΠ΅Π½Ρ (ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΈΠ΅ΡΠ°ΡΡ
ΠΈΡ
ctx.cancel
->gCtx.cancel
Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ); - ΠΡΠ΄Π΅Ρ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ, Π΅ΡΠ»ΠΈ Ρ ΠΎΡΡ ΠΎΠ΄Π½Π° ΠΈΠ· Π½ΠΈΡ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ - ΡΠΎ ΠΎΡΠΌΠ΅Π½ΠΈΡ ΡΠ²ΠΎΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ΅Π³ΠΎ Π²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΌΠΎΠ³ΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΈΠ³Π½Π°Π» ΠΎΡΠΌΠ΅Π½Ρ ΡΠ΅ΡΠ΅Π· ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠ΅ ΠΈΠΌ gCtx ΠΈ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΡΠ²ΠΎΡ ΡΠ°Π±ΠΎΡΡ.
Π’Π°ΠΊΠ°Ρ ΡΡ
Π΅ΠΌΠ° Π² ΡΠ΅Π»ΠΎΠΌ Π½Π΅ΠΏΠ»ΠΎΡ
Π°, Π½ΠΎ Ρ Π½Π°Ρ
ΠΎΠΆΡ Π² Π½Π΅ΠΉ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΉ ΡΠ°ΡΠ°Π»ΡΠ½ΡΠΉ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΠΊ: errgroup Π·Π°ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡΡΡ Π½Π° ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΎΡΠΌΠ΅Π½Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ ΠΏΠΎΡΡΠ΄ΠΊΠ° ΠΎΡΠΌΠ΅Π½Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΈΠ· Π½ΠΈΡ
ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠΉ Π΅ΠΉ gCtx Π½Π° .Done()
Π² Π»ΡΠ±ΠΎΠΉ ΡΠ΄ΠΎΠ±Π½ΡΠΉ Π΄Π»Ρ Π½Π΅Ρ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΈ Π² ΠΈΡΠΎΠ³Π΅ ΠΌΡ ΡΠ΅ΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° Ρ Π²Π°Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ Π±Π°Π·ΠΎΠΉ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎ cancel
ΠΈ Π·Π°Π²Π΅ΡΡΠΈΠ»ΠΎΡΡ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΠΈΠΉ Π²Π°ΠΆΠ½ΡΠΉ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ Π·Π°ΠΏΡΠΎΡ) Π·Π°Π²Π΅ΡΡΠΈΠ» ΡΠ²ΠΎΡ ΡΠ°Π±ΠΎΡΡ.
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ:
- errgroup Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠΈΠ±ΠΊΡ, ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅Ρ;
- errgroup ΠΎΡΠΌΠ΅Π½ΡΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΈΠ· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π²Π΅ΡΠ½ΡΠ» ΠΎΡΠΈΠ±ΠΊΡ. ΠΡΠ»ΠΈ ΠΆΠ΅ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΏΡΠΈΡΠΈΠ½Π΅ Π½Π΅ΠΊΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ Π±Π΅Π· ΠΎΡΠΈΠ±ΠΊΠΈ, ΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ° Π½Π΅ ΠΎΡΡΠ΅Π°Π³ΠΈΡΡΠ΅Ρ, ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΠ² ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΠΊΠ°ΠΊ Π½ΠΈ Π² ΡΡΠΌ Π½Π΅ Π±ΡΠ²Π°Π»ΠΎ. ΠΠ°, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΠΊΠ°ΠΊΠΈΠΌ-Π½ΠΈΠ±ΡΠ΄Ρ Π²Π΅Π»ΠΎΡΠΈΠΏΠ΅Π΄ΠΎΠΌ, Π½ΠΎ Π² ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π·Π°ΡΠ΅ΠΌ ΠΌΡ Π²ΠΎΠΎΠ±ΡΠ΅ ΡΡΠΎ-ΡΠΎ Π±ΡΠ°Π»ΠΈ, Π΅ΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΌ Π²ΡΡ ΡΠ°Π²Π½ΠΎ ΠΏΡΠΈΠ΄ΡΡΡΡ Π΄ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ?
ΠΠ΄Π΅Ρ, ΠΊΠ°ΠΆΠ΅ΡΡΡ, Π»Π΅ΠΆΠΈΡ Π½Π° ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ: Π΅ΡΠ»ΠΈ errgroup Π½Π΅ Π΄Π°ΡΡ Π½Π°ΠΌ Π½ΡΠΆΠ½ΡΡ Π³Π°ΡΠ°Π½ΡΠΈΠΉ, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΠΉ Π²Π΅Π»ΠΎΡΠΈΠΏΠ΅Π΄, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡ Π΄Π°ΡΡ. Π’Π°ΠΊΠΈΡ ΠΈΠ΄Π΅ΠΉ Π² ΡΠ²ΠΎΡ Π²ΡΠ΅ΠΌΡ Π½Π΅ ΠΈΠ·Π±Π΅ΠΆΠ°Π» ΠΈ Ρ ΠΈ Π»ΠΈΡΠ½ΠΎ Ρ ΠΌΠ΅Π½Ρ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ ΡΡΠΎ-ΡΠΎ ΡΠ°ΠΊΠΎΠ΅:
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
logger := log.New(os.Stderr, "", 0)
logger.Print("Started")
lc := lifecycle.NewLifecycle()
dbConn := components.NewDBConn(logger)
lc.AddServer(func(ctx context.Context) error { // ΠΏΡΠΎΡΡΠΎ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ΅ΠΌ Π² ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΈ ΡΠ°ΡΠ΄Π°ΡΠ½Π΅ΡΡ
return dbConn.Connect(ctx)
}).AddShutdowner(func(ctx context.Context) error {
return dbConn.Stop(ctx)
})
httpSrv := components.NewHTTPServer(logger, dbConn)
lc.Add(httpSrv) // ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ httpSrv ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ Server ΠΈ Shutdowner
go func() {
components.AwaitSignal(ctx)
lc.Stop(context.Background())
}()
_ = lc.Serve(ctx)
Π ΡΠ°ΠΊΠ°Ρ ΠΈΠ΄Π΅Ρ Ρ
ΠΎΡΠΎΡΠ° Π²ΡΠ΅ΠΌ, ΠΊΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΡΠ»ΠΎΠΆΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΠΎ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π½Π°ΡΠΈΠ²Π½ΡΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π° ΡΠ°ΠΌΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ°.
(ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠΎΠ΅Π³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° lifecycle
Ρ Π½Π΅ ΡΡΠ°Π» Π½ΠΈΠ³Π΄Π΅ Π²ΡΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡ, ΡΡΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ»Π°)
Π‘ΡΡΠ΅ΡΡΠ²ΡΠΉ ΠΌΡ Π² ΠΌΠΈΡΠ΅ Java ΠΈΠ»ΠΈ Π³Π΄Π΅-ΡΠΎ Π΅ΡΡ, ΡΠΎ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈΡΡ Π±Ρ Π½Π° ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, Π·Π°ΠΏΡΡΠΊΠ° ΠΈ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² "ΡΡΠΊΠ°ΠΌΠΈ" Π·Π²ΡΡΠΈΡ, ΠΊΠ°ΠΊ ΠΎΡΠ΅Π½Ρ Π½Π΅Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ½Π°Ρ ΡΠ°Π±ΠΎΡΠ° Π±Π΅Π· ΠΏΡΠ°Π²Π° Π½Π° ΠΎΡΠΈΠ±ΠΊΡ. ΠΠΎ Π² Π³ΠΎ Π΅ΡΡΡ ΡΡΠΈ ΡΠ΄ΠΎΠ±Π½ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠ±Π»Π΅Π³ΡΠ°ΡΡ ΡΡΠΎ Π΄Π΅Π»ΠΎ. ΠΡΠΎ Π³ΠΎΡΡΡΠΈΠ½Ρ Π² ΠΊΡΡΡΠ΅, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π²ΡΠ΅, ΠΊΡΠΎ Ρ ΠΎΡΡ ΡΡΡΡ-ΡΡΡΡ ΡΡΠΈΠΌ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°Π»ΡΡ, ΠΈ Π΅ΡΠ»ΠΈ Π²Ρ Π½Π΅ Π² ΠΈΡ ΡΠΈΡΠ»Π΅, ΡΠΎ Π²ΡΡΠ΄ Π»ΠΈ Π²Ρ ΠΏΠΎΠ½ΡΠ»ΠΈ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΊΠΎΠ΄Π°, ΡΠ°ΠΊ ΡΡΠΎ Ρ Π½Π΅ ΡΡΠ°Π½Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΏΠΎΡΡΠ½Π΅Π½ΠΈΡ, ΡΠ΅ΠΌ Π±ΠΎΠ»Π΅Π΅, ΡΡΠΎ ΡΡΠΎ Π²ΠΎΠΏΡΠΎΡ Π±ΡΠΊΠ²Π°Π»ΡΠ½ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Π±Π·Π°ΡΠ° ΠΈΠ· ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΆΠ΅ ΡΡΡΠ»ΠΊΠΈ Π² Π³ΡΠ³Π»Π΅. ΠΡΠΎΡΠΎΠΉ ΡΠ°ΠΊΠΎΠΉ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΡΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ, Π½Π΅ΠΊΠΈΠΉ "Π²ΠΎΠ»ΡΠ΅Π±Π½ΡΠΉ" ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, ΡΠΆΠ΅ ΠΏΠΎΡΡΠΈ Π»ΡΠ±Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π² Π³ΠΎ ΠΈ ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΡΠΎΠΌΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠ΅Π³ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ·Π½Π°ΡΡ, Π±ΡΠ» Π»ΠΈ Π΄Π°Π½Π½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΎΡΠΌΠ΅Π½ΡΠ½ (ΠΈΠ»ΠΈ ΠΎΡΠΌΠ΅Π½ΠΈΡΡ Π΅Π³ΠΎ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ Π΄Π»Ρ Π½ΠΈΠΆΠ΅Π»Π΅ΠΆΠ°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ). Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ°ΠΊΠΎΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π΄Π°ΡΡ Π½Π°ΠΌ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΠΊΠ°ΡΠΊΠ°Π΄Π½ΠΎ Π·Π°Π²Π΅ΡΡΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ»ΠΈ Π³ΡΡΠΏΠΏΡ ΡΡΠ½ΠΊΡΠΈΠΉ - Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ ΠΈΠ· main-ΡΡΠ½ΠΊΡΠΈΠΈ. Π’ΡΠ΅ΡΠΈΠΉ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΠΈ ΡΡΡΡ ΠΌΠ΅Π½Π΅Π΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Ρ, defer, ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΡΡΠΎ ΠΊΠ»ΡΡΠ΅Π²ΡΠΌ ΡΠ»ΠΎΠ²ΠΎΠΌ, Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΠΈΠΌ Π² Π½Π΅ΠΊΠΈΠΉ ΡΡΠ΅ΠΊ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄ΡΡΠ³ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π° ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΊΡΡΠ΅ΠΉ. Π ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π²ΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , ΠΏΠΎΡΠ»Π΅ defer'Π° ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ³ΠΎΠ΄Π½ΠΎ return'ΠΎΠ² Π½Π΅ Π±ΠΎΡΡΡ, ΡΡΠΎ Π³Π΄Π΅-ΡΠΎ Π·Π°Π±ΡΠ΄Π΅ΡΡ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΌΡΡΡΠ΅ΠΊΡ ΠΈΠ»ΠΈ Π·Π°ΠΊΡΡΡΡ ΡΠ°ΠΉΠ» (ΠΊΡΡΠ°ΡΠΈ, ΠΎΡΠ΅Π½Ρ ΡΠΏΠΎΡΠΎΠ±ΡΡΠ²ΡΠ΅Ρ ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΡ Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΠΉ Π² ΠΊΠΎΠ΄Π΅), Π° Π²ΠΎ-Π²ΡΠΎΡΡΡ , ΠΎΠ½ΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π² ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅. ΠΠΎΠΆΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ Π΄Π΅ΡΡΡΡΠΊΡΠΎΡ ΠΈ ΠΎΠ½ΠΈ Π²ΡΠ·ΠΎΠ²ΡΡΡΡ ΡΠ°ΠΌΠΈ, ΠΏΠΎ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ, Π² ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ Π³ΡΠ°ΡΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, Π½Π΅ ΡΡΠ΅Π±ΡΡ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ²:
a, err := NewA()
if err != nil {
panic("cant create a: " + err.Error())
}
go a.Serve()
defer a.Stop()
b, err := NewB(a)
if err != nil {
panic("cant create b: " + err.Error())
}
go b.Serve()
defer b.Stop()
/*
ΠΠΎΡΡΠ΄ΠΎΠΊ ΡΡΠ°ΡΡΠ°: A, B
ΠΠΎΡΡΠ΄ΠΎΠΊ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ: B, A
*/
ΠΡΠ°Π²Π΄Π°, ΠΎΡΡΠ°ΡΡΡΡ Π΅ΡΡ Π²ΠΎΠΏΡΠΎΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ, Π° ΡΠ°ΠΊΠΆΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΈ (ΡΡΠΎ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π½ΠΎ ΠΌΠ½Π΅ Π½ΡΠ°Π²ΠΈΡΡΡ Π΄Π΅Π»Π°ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊ). ΠΠ΅Π»ΠΎ Π½Π΅ ΠΎΠ±ΠΎΠΉΠ΄ΡΡΡΡ Π±Π΅Π· ΡΡΠ΅Ρ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΡ Ρ Π΅Π»ΠΏΠ΅ΡΠΎΠ²:
- ErrSet - Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΎΡΠΈΠ±ΠΎΠΊ Π΄Π»Ρ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΡΠ°ΡΡΠ°/ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ;
- Serve - ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΈ ΡΡΠ½ΠΊΡΠΈΡ-server, ΡΡΠ°ΡΡΡΠ΅Ρ ΡΡΠΎΡ server Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ Π³ΠΎΡΡΡΠΈΠ½Π΅ ΠΈ ΠΏΡΠΈ ΡΡΠΎΠΌ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΠΎΠ²ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ, ΠΎΠ±Π΅ΡΠ½ΡΡΡΠΉ Π² WithCancel, Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΠΉ ΠΏΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ-server'Π° (ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠ΅ΠΊΡΠ°ΡΠΈΡΡ Π·Π°ΠΏΡΡΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π΅, Π΅ΡΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ server'ΠΎΠ² Π·Π°Π²Π΅ΡΡΠΈΠ»ΡΡ);
- Shutdown - ΠΏΡΠΎΡΡΠΎ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ ΠΏΠΈΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΠΎΡΠΈΠ±ΠΊΡ Π² ErrSet, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠΆΠ΅ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ, Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΊΠ°ΠΊ-Π»ΠΈΠ±ΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²;
Π ΠΈΡΠΎΠ³Π΅, ΠΊΠΎΠ΄ Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ°ΠΊ:
package main
import (
"context"
"fmt"
"log"
"os"
"errors"
"net/http"
"github.com/vivid-money/article-golang-di/pkg/components"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
logger := log.New(os.Stderr, "", 0)
logger.Print("Started")
go func() {
components.AwaitSignal(ctx)
cancel()
}()
errset := &ErrSet{}
errset.Add(runApp(ctx, logger, errset))
_ = errset.Error() // ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ
/*
Output:
---
Started
New DBConn
Connecting DBConn
Connected DBConn
New HTTPServer
Serving HTTPServer
^CStop HTTPServer
Stop DBConn
Stopped DBConn
Stopped HTTPServer
Finished serving HTTPServer
*/
}
func runApp(ctx context.Context, logger components.Logger, errSet *ErrSet) error {
var err error
dbConn := components.NewDBConn(logger)
if err := dbConn.Connect(ctx); err != nil {
return fmt.Errorf("cant connect dbConn: %w", err)
}
defer Shutdown("dbConn", errSet, dbConn.Stop)
httpServer := components.NewHTTPServer(logger, dbConn)
if ctx, err = Serve(ctx, "httpServer", errSet, httpServer.Serve); err != nil && !errors.Is(err, http.ErrServerClosed) {
return fmt.Errorf("cant serve httpServer: %w", err)
}
defer Shutdown("httpServer", errSet, httpServer.Stop)
components.AwaitSignal(ctx)
return ctx.Err()
}
Π ΠΊΠ°ΡΠ΅ΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΡ ΡΠΊΠ°ΠΆΡ, ΡΡΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π²ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π² ΡΠΎΠ½ΠΎΠ²ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΠΈ Π½Π°ΠΏΠΎΠΌΠ½Ρ, ΡΡΠΎ ΡΡΠΎ Π»ΠΈΡΡ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΠΎΠ±ΡΠ°Π·Π΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΡΠ°ΡΡΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΈ ΠΏΡΠΎΡΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π΅ Π²Π΅ΡΠ΅ΠΉ.
Π§ΡΠΎ Π½Π°ΠΌ Π΄Π°ΡΡ ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄?
- ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΊΠ°ΠΊ ΠΈ ΡΠ°Π½ΡΡΠ΅, ΠΊΠΎΠΏΠΈΠΏΠ°ΡΡΠΎΠΌ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ΅ΡΡΡΠ΅Ρ ΡΠ»ΠΎΠ² New-Serve-defer-Shutdown (Π±ΡΠ΄Ρ Ρ Π½Π°Ρ Π΄ΠΆΠ΅Π½Π΅ΡΠΈΠΊΠΈ, ΠΊΡΡΠ°ΡΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π΅ΡΡ Π½Π°Π±ΡΠΎΡΠ°ΡΡ ΠΏΡΠΎΡΡΠ΅Π½ΡΠΊΠΈΠΉ Ρ Π΅Π»ΠΏΠ΅Ρ, ΡΡΠΎΠ±Ρ Π±ΡΠ»ΠΎ Π΅ΡΡ ΠΌΠ΅Π½ΡΡΠ΅ ΠΊΠΎΠ΄Π° ΠΈ ΡΠΎΠ²ΡΠ΅ΠΌ ΡΠΈΠΌΠΏΠ°ΡΠΈΡΠ½ΠΎ);
- ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΈ ΡΠ°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΎΠ½ΠΈ Π·Π°Π²ΠΈΡΡΡ Π΄ΡΡΠ³ ΠΎΡ Π΄ΡΡΠ³Π°, ΡΠΎ ΠΎΡΠΈΠ±ΠΊΠ°, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΉ Π²Ρ Π½Π°ΡΠ½ΡΡΠ΅ ΠΈΠ»ΠΈ Π·Π°Π²Π΅ΡΡΠΈΡΠ΅ ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π² Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΡΠ²Π΅Π΄Π΅Π½Π° ΠΊ Π½ΡΠ»Ρ;
- ΠΡΠΈΠ±ΠΊΠ° Π² ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΡΠ²ΠΈΡΠ° ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π΄ΠΎΡΡΠΎΡΠ½ΠΎΠΌΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ;
- ΠΠ°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΉ (Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΡΠ΄ΠΊΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ) ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ;
- ΠΡΠΈΠ±ΠΊΠ° ΡΠ°Π±ΠΎΡΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΠΏΡΠΈΠ²Π΅Π΄Π΅Ρ ΠΊ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π½ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΡ ΡΠ°Π²Π½ΠΎ ΠΎΡΡΠ°Π½Π΅ΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΉ, ΠΎΡ ΠΊΠΎΠ½ΡΠ° ΠΊ Π½Π°ΡΠ°Π»Ρ;
- ΠΡ 100% Π΄ΠΎΠΆΠ΄ΡΠΌΡΡ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ Π²ΡΠ΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², ΠΏΡΠ΅ΠΆΠ΄Π΅, ΡΠ΅ΠΌ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅;
- ΠΠ΅ΡΡ ΠΊΠΎΠ΄, ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡΠΈΠΉ ΡΠ°Π±ΠΎΡΡ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π°, ΠΎΠΏΠΈΡΠ°Π½ ΠΎΡΠ΅Π½Ρ ΡΠ²Π½ΠΎ ΠΈ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½ΠΈΠΊΠ°ΠΊΠΈΠΉ ΠΌΠ°Π³ΠΈΠΈ;
ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΊΠΈ
- ΠΠΈΡΠ΅ΡΡΡ ΡΡΠΊΠ°ΠΌΠΈ, Π° Π·Π½Π°ΡΠΈΡ ΠΏΡΠΈ ΡΠΎΡΠ½ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡΡ ΠΊ ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ;
Π‘Π°ΠΌΠΎΠΉ Π»ΡΡΡΠ΅ΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΎΠΉ Π²ΡΠ΅Π³Π΄Π° ΠΎΡΡΠ°ΡΡΡΡ Π²ΡΠ±ΠΎΡ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠ΅Π³ΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° ΠΏΠΎΠ΄ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ Π·Π°Π΄Π°ΡΡ.
ΠΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΠ΅ ΠΌΠ½ΠΎΠΉ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΈΠΌΠ΅ΡΡ ΡΠ²ΠΎΠΈ Π΄ΠΎΡΡΠΎΠΈΠ½ΡΡΠ²Π° ΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠΈ, ΠΊΠ°ΠΊ ΡΠ°ΠΌΠΈ ΠΏΠΎ ΡΠ΅Π±Π΅, ΡΠ°ΠΊ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΊ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π½Π° golang.
ΠΠΏΠΈΡΠ°Π½Π½ΡΠΉ ΠΏΠ΅ΡΠ²ΡΠΌ fx Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠ²ΠΎΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π½Π΅ΠΈΠ΄ΠΈΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎΡΡΡ (Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ go), Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Ρ
ΠΎΡΠΎΡΠΎ ΠΏΡΠΎΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΠΌΠΈ ΠΈ ΡΠ΅ΡΠ°Π΅Ρ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ Π·Π°Π΄Π°ΡΠΈ, Π° ΡΡΠΎ Π½Π΅ ΡΠ΅ΡΠ°Π΅Ρ - Π½Π΅ΡΠ»ΠΎΠΆΠ½ΠΎ Π΄ΠΎΠΏΠΈΡΠ°ΡΡ ΡΡΠΊΠ°ΠΌΠΈ.
Wire Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° Π³ΡΠΎΠΌΠΊΠΎΠ΅ ΠΈΠΌΡ ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Π΅ΠΉ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΡΡΠΎΠ²Π°ΡΡΠΌ ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π΅Π΄ΠΎΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΠΌ, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ Π±Π΅Π·ΡΡΠ»ΠΎΠ²Π½ΠΎ ΠΈΠ΄ΠΈΠΎΠΌΠ°ΡΠΈΡΠ΅Π½ ΠΈ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ.
ΠΡΠΈ ΡΡΠΎΠΌ ΠΈΠ½ΠΆΠ΅ΠΊΡΡ ΡΡΠΊΠ°ΠΌΠΈ Π½Π΅ Π²ΡΠ³Π»ΡΠ΄ΡΡ (Π΄Π° ΠΈ Π½Π΅ ΡΠ²Π»ΡΡΡΡΡ, ΠΏΠΎ ΠΌΠΎΠ΅ΠΌΡ ΠΎΠΏΡΡΡ) ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π±ΠΎΠ»Π΅Π·Π½Π΅Π½Π½ΡΠΌΠΈ, Π° Π²ΡΠ΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ Π·Π°Π΄Π°ΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΡΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ
go
, context
, defer
ΠΈ ΠΏΠ°ΡΡ Ρ
Π΅Π»ΠΏΠ΅ΡΠΎΠ² ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°.
ΠΠ°ΠΆΠ½Π΅ΠΉΡΠΈΠΌ Π΄Π΅Π»ΠΎΠΌ Π²ΡΠ΅Π³Π΄Π° ΡΠ²Π»ΡΠ΅ΡΡΡ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°, ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠ½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° ΡΠ°ΡΡΠΈ Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΌΠΈ Π·ΠΎΠ½Π°ΠΌΠΈ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΠΈ, Π° Π²ΠΎΠΏΡΠΎΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠ½ΠΆΠ΅ΠΊΡΠΎΠ² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΡΠΈΡΠΈΡΠ½ΡΠΌ, Π΄ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΈΠ»ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ. ΠΠΈΡΠ½ΠΎ Ρ Π±Ρ Π΄ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΡΠ΅Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π±Π΅Π· ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ ΡΠ±ΠΎΡΠ° Π³ΡΠ°ΡΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΡΡΠΊΠ°ΠΌΠΈ, Π° ΡΠΆΠ΅ ΠΏΠΎΡΠΎΠΌ ΠΏΡΠΈΡΠΌΠΎΡΡΠ΅Π»ΡΡ ΠΊ wire (ΠΌΠΎΠΆΠ΅Ρ, ΠΊ ΡΠΎΠΌΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΎΠ½ Π½Π°ΡΡΠΈΡΡΡΡ ΡΠ΅ΡΠ°ΡΡ Π²ΠΎΠΎΠ±ΡΠ΅ Π²ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ, ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΠΎΡΠΎΡΡΡ
Ρ
ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ ΠΎΡ Π½Π΅Π³ΠΎ ΠΎΠΆΠΈΠ΄Π°ΡΡ).