Π‘ΠΎΠΎΠ±ΡΠ΅ΡΡΠ²ΠΎ .NET-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π Π°ΠΉΡΡΠ°ΠΉΠ·Π΅Π½Π±Π°Π½ΠΊΠ° ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ ΠΊΡΠ°ΡΠΊΠΈΠΉ ΡΠ°Π·Π±ΠΎΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ViennaNET. Π ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΌΡ ΠΊ ΡΡΠΎΠΌΡ ΠΏΡΠΈΡΠ»ΠΈ,
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΏΡΠΎΠΉΠ΄Π΅ΠΌΡΡ ΠΏΠΎ Π΅ΡΠ΅ Π½Π΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΠΌΠΈ, ΠΎΡΠ΅ΡΠ΅Π΄ΡΠΌΠΈ ΠΈ ΠΠ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π² Π½Π°ΡΠ΅ΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ Π½Π° GitHub (
ViennaNET.Sagas
ΠΠΎΠ³Π΄Π° Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ Π½Π° DDD ΠΈ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ½ΡΡ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΡ, ΡΠΎ ΠΏΡΠΈ ΡΠ°Π·Π½Π΅ΡΠ΅Π½ΠΈΠΈ Π±ΠΈΠ·Π½Π΅Ρ-Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΏΠΎ ΡΠ°Π·Π½ΡΠΌ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΡΠ²ΡΠ·Π°Π½Π½Π°Ρ Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΠ° ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ
ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ, Π²Π΅Π΄Ρ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΠΈ ΡΠ°ΡΡΠΎ Π·Π°ΡΡΠ°Π³ΠΈΠ²Π°ΡΡ ΡΡΠ°Π·Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄ΠΎΠΌΠ΅Π½ΠΎΠ². Π‘ ΡΠ°ΠΊΠΈΠΌΠΈ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΠ°ΠΌΠΈ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,
Π Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ ΠΌΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ ΠΏΡΠΎΡΡΠΎΠΉ, Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ: ΡΠ°Π³Π°, Π° ΡΠΎΡΠ½Π΅Π΅ ΡΠ°Π³Π° Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΈΠΈ. Π‘ΡΡΡ Π΅Π΅ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ: Π΅ΡΡΡ Π½Π΅ΠΊΠΈΠΉ Π±ΠΈΠ·Π½Π΅Ρ-ΡΡΠ΅Π½Π°ΡΠΈΠΉ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΠ²Π΅ΡΡΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π² ΡΠ°Π·Π½ΡΡ ΡΠ΅ΡΠ²ΠΈΡΠ°Ρ , ΠΏΡΠΈ ΡΡΠΎΠΌ, Π² ΡΠ»ΡΡΠ°Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π½Π° Π»ΡΠ±ΠΎΠΌ ΡΠ°Π³Π΅, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠ·Π²Π°ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ΠΎΡΠΊΠ°ΡΠ° Π²ΡΠ΅Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ ΡΠ°Π³ΠΎΠ², Π³Π΄Π΅ ΠΎΠ½Π° ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π² ΠΊΠΎΠ½ΡΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ°Π³ΠΈ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΡΠΏΠ΅ΡΠ½ΠΎΡΡΠΈ, ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΊΠΎΠ½ΡΠΈΡΡΠ΅Π½ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π²ΠΎ Π²ΡΠ΅Ρ Π΄ΠΎΠΌΠ΅Π½Π°Ρ .
ΠΠ°ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΠΊΠ° ΡΠ΄Π΅Π»Π°Π½Π° Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΈ Π½Π΅ Π·Π°Π²ΡΠ·Π°Π½Π° Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ. ΠΡΠΈΠΌΠ΅Π½ΡΡΡ Π΅Ρ Π½Π΅ΡΠ»ΠΎΠΆΠ½ΠΎ: Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π½Π°ΡΠ»Π΅Π΄Π½ΠΈΠΊΠ° ΠΎΡ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° SagaBase<Π’>, Π³Π΄Π΅ T β ΡΡΠΎ Π²Π°Ρ ΠΊΠ»Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Ρ ΡΠ°Π½ΠΈΡΡ ΠΈΡΡ ΠΎΠ΄Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΡΠ°Π³ΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ. ΠΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠ±ΡΠ°ΡΡΠ²Π°ΡΡΡΡ Π²ΠΎ Π²ΡΠ΅ ΡΠ°Π³ΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. Π‘Π°ΠΌΠ° ΡΠ°Π³Π° ΡΠ²Π»ΡΠ΅ΡΡΡ stateless ΠΊΠ»Π°ΡΡΠΎΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ Π² DI ΠΊΠ°ΠΊ Singleton, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ.
ΠΡΠΈΠΌΠ΅Ρ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ:
public class ExampleSaga : SagaBase<ExampleContext>
{
public ExampleSaga()
{
Step("Step 1")
.WithAction(c => ...)
.WithCompensation(c => ...);
AsyncStep("Step 2")
.WithAction(async c => ...);
}
}
ΠΡΠΈΠΌΠ΅Ρ Π²ΡΠ·ΠΎΠ²Π°:
var saga = new ExampleSaga();
var context = new ExampleContext();
await saga.Execute(context);
ΠΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΡΠ°Π·Π½ΡΡ
ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ
ViennaNET.Orm.*
ΠΠ°Π±ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΠΠ ΡΠ΅ΡΠ΅Π· Nhibernate. Π£ Π½Π°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ DB-First Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Liquibase, ΠΏΠΎΡΡΠΎΠΌΡ Π·Π΄Π΅ΡΡ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» ΠΏΠΎ ΡΠ°Π±ΠΎΡΠ΅ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ Π² Π³ΠΎΡΠΎΠ²ΠΎΠΉ ΠΠ.
ViennaNET.Orm.Seedwork ΠΈ ViennaNET.Orm
β Π³Π»Π°Π²Π½ΡΠ΅ ΡΠ±ΠΎΡΠΊΠΈ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠ΅ Π±Π°Π·ΠΎΠ²ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ ΠΈ ΠΈΡ
ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ. ΠΡΡΠ°Π½ΠΎΠ²ΠΈΠΌΡΡ Π½Π° ΠΈΡ
ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠΌ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅.
ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IEntityFactoryService
ΠΈ Π΅Π³ΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ EntityFactoryService
ΡΠ²Π»ΡΡΡΡΡ Π³Π»Π°Π²Π½ΠΎΠΉ ΠΎΡΠΏΡΠ°Π²Π½ΠΎΠΉ ΡΠΎΡΠΊΠΎΠΉ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΠ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π·Π΄Π΅ΡΡ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Unit of Work, ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌΠΈ ΡΡΡΠ½ΠΎΡΡΡΠΌΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ ΠΏΡΡΠΌΡΡ
SQL-Π·Π°ΠΏΡΠΎΡΠΎΠ². ΠΠ½ΠΎΠ³Π΄Π° ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΊΠ»Π°ΡΡΠ° ΠΏΠΎ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΠ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ
. ΠΠ»Ρ ΡΠ°ΠΊΠΈΡ
ΡΠ»ΡΡΠ°Π΅Π² Ρ IEntityFactoryService
Π΅ΡΡΡ ΠΏΡΠ΅Π΄ΠΎΠΊ β ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IEntityRepositoryFactory
, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΠΎΠ΄ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅Π².
ΠΠ»Ρ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ ΠΠ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠΎΠ². ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ Ρ Π½Π°Ρ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ
Π‘Π£ΠΠ Π΅ΡΡΡ ΡΠ²ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql
.
ΠΡΠΈ ΡΡΠΎΠΌ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΡΠ°ΠΌΠΊΠ°Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²ΠΈΡΠ° Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ Π·Π°ΡΡΠ°Ρ Π½Π° Π΄ΠΎΡΠ°Π±ΠΎΡΠΊΡ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΡΠΈ ΠΏΠΎΡΠ°Π³ΠΎΠ²ΡΡ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ Ρ ΠΎΠ΄Π½ΠΎΠΉ Π‘Π£ΠΠ Π½Π° Π΄ΡΡΠ³ΡΡ. ΠΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π²ΡΠ±ΠΎΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ° Π΄Π»Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°-ΡΡΡΠ½ΠΎΡΡΠΈ (Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΈ ΠΏΠΈΡΠ΅ΡΡΡ ΠΌΠ°ΠΏΠΏΠΈΠ½Π³ Π½Π° ΡΠ°Π±Π»ΠΈΡΡ ΠΠ) ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΡΠ΅ΡΠ΅Π· ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΡΡΡΠ½ΠΎΡΡΠΈ Π² ΠΊΠ»Π°ΡΡΠ΅ BoundedContext (ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ Π΄Π»Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ Π΄ΠΎΠΌΠ΅Π½Π½ΡΡ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ) ΠΈΠ»ΠΈ Π΅Π³ΠΎ Π½Π°ΡΠ»Π΅Π΄Π½ΠΈΠΊΠ° ApplicationContext (ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Ρ Π΄Π»Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ, ΠΏΡΡΠΌΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄), Π³Π΄Π΅ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅ΡΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΠ· ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ:
"db": [
{
"nick": "mssql_connection",
"dbServerType": "MSSQL",
"ConnectionString": "...",
"useCallContext": true
},
{
"nick": "oracle_connection",
"dbServerType": "Oracle",
"ConnectionString": "..."
}
],
ΠΡΠΈΠΌΠ΅Ρ ApplicationContext:
internal sealed class DbContext : ApplicationContext
{
public DbContext()
{
AddEntity<SomeEntity>("mssql_connection");
AddEntity<MigratedSomeEntity>("oracle_connection");
AddEntity<AnotherEntity>("oracle_connection");
}
}
ΠΡΠ»ΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π½Π΅ ΡΠΊΠ°Π·Π°Π½, ΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ Β«defaultΒ».
ΠΠ΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΌΠ°ΠΏΠΏΠΈΠ½Π³ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ Π½Π° ΡΠ°Π±Π»ΠΈΡΡ ΠΠ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ NHibernate. ΠΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΠ°ΠΊ ΡΠ΅ΡΠ΅Π· xml-ΡΠ°ΠΉΠ»Ρ, ΡΠ°ΠΊ ΠΈ ΡΠ΅ΡΠ΅Π· ΠΊΠ»Π°ΡΡΡ. ΠΠ»Ρ ΡΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅Π²-Π·Π°Π³Π»ΡΡΠ΅ΠΊ Π² Unit-ΡΠ΅ΡΡΠ°Ρ
, ΠΈΠΌΠ΅Π΅ΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ViennaNET.TestUtils.Orm
.
ΠΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ViennaNET.Orm.* ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ
ViennaNET.Messaging.*
ΠΠ°Π±ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΡΠΌΠΈ.
ΠΠ»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΡΠΌΠΈ Π±ΡΠ» Π²ΡΠ±ΡΠ°Π½ ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄, ΡΡΠΎ ΠΈ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ Π‘Π£ΠΠ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ β ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΉ ΡΠ½ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ. ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ViennaNET.Messaging
ΠΊΠ°ΠΊ ΡΠ°Π· ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° ΡΡΡ ΡΠ½ΠΈΡΠΈΠΊΠ°ΡΠΈΡ, Π° ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue ΠΈ ViennaNET.Messaging.KafkaQueue
ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π°Π΄Π°ΠΏΡΠ΅ΡΠΎΠ² Π΄Π»Ρ IBM MQ, RabbitMQ ΠΈ Kafka ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ.
Π ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΡΠΌΠΈ Π΅ΡΡΡ Π΄Π²Π° ΠΏΡΠΎΡΠ΅ΡΡΠ°: ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ°.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅. ΠΠ΄Π΅ΡΡ Π΅ΡΡΡ 2 Π²Π°ΡΠΈΠ°Π½ΡΠ°: Π΄Π»Ρ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π½ΠΈΡ ΠΈ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΠ»Ρ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π½ΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π»Ρ Π½Π°ΡΠ°Π»Π° ΠΎΠΏΠΈΡΠ°ΡΡ ΠΊΠ»Π°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°, ΡΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½Π½ΡΠΉ ΠΎΡ IMessageProcessor
, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π²Ρ
ΠΎΠ΄ΡΡΠ΅Π³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΠ°Π»Π΅Π΅ Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΌΠΎ Β«ΠΏΡΠΈΠ²ΡΠ·Π°ΡΡΒ» ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ, Π΄Π΅Π»Π°Π΅ΡΡΡ ΡΡΠΎ ΡΠ΅ΡΠ΅Π· ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ Π² IQueueReactorFactory
Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΈΠ· ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ:
"messaging": {
"ApplicationName": "MyApplication"
},
"rabbitmq": {
"queues": [
{
"id": "myQueue",
"queuename": "lalala",
...
}
]
},
ΠΡΠΈΠΌΠ΅Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π½ΠΈΡ:
_queueReactorFactory.Register<MyMessageProcessor>("myQueue");
var queueReactor = queueReactorFactory.CreateQueueReactor("myQueue");
queueReactor.StartProcessing();
ΠΠ°ΡΠ΅ΠΌ, ΠΏΡΠΈ ΡΡΠ°ΡΡΠ΅ ΡΠ΅ΡΠ²ΠΈΡΠ° ΠΈ Π²ΡΠ·ΠΎΠ²Π° ΠΌΠ΅ΡΠΎΠ΄Π° Π΄Π»Ρ Π½Π°ΡΠ°Π»Π° ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π½ΠΈΡ, Π²ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈΠ· ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π±ΡΠ΄ΡΡ ΠΏΠΎΠΏΠ°Π΄Π°ΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ.
ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅-ΡΠ°Π±ΡΠΈΠΊΠ΅ IMessagingComponentFactory
Π΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ CreateMessageReceiver
, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ, ΠΎΠΆΠΈΠ΄Π°ΡΡΠ΅Π³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈΠ· ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π΅ΠΌΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ:
using (var receiver = _messagingComponentFactory.CreateMessageReceiver<TestMessage>("myQueue"))
{
var message = receiver.Receive();
}
ΠΠ»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π²ΡΡ ΡΠΎΠΉ ΠΆΠ΅ IMessagingComponentFactory
ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ:
using (var sender = _messagingComponentFactory.CreateMessageSender<MyMessage>("myQueue"))
{
sender.SendMessage(new MyMessage { Value = ...});
}
ΠΠ»Ρ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ Π΄Π΅ΡΠ΅ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π΅ΡΡΡ ΡΡΠΈ Π³ΠΎΡΠΎΠ²ΡΡ
Π²Π°ΡΠΈΠ°Π½ΡΠ°: ΠΏΡΠΎΡΡΠΎ ΡΠ΅ΠΊΡΡ, XML ΠΈ JSON, Π½ΠΎ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ²ΠΎΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² IMessageSerializer ΠΈ IMessageDeserializer
.
ΠΡ ΠΏΠΎΡΡΠ°ΡΠ°Π»ΠΈΡΡ ΡΠΎΡ
ΡΠ°Π½ΠΈΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ViennaNET.Messaging.MQSeriesQueue
ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠ΅, Π½ΠΎ ΠΈ Π±Π°ΠΉΡΠΎΠ²ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, Π° ViennaNET.Messaging.RabbitMQQueue
ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠΎΡΡΠΈΠ½Π³ ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ βΠ½Π° Π»Π΅ΡΡβ. Π Π½Π°ΡΠ΅ΠΉ ΠΎΠ±Π΅ΡΡΠΊΠ΅ Π°Π΄Π°ΠΏΡΠ΅ΡΠ° Π΄Π»Ρ RabbitMQ ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ RPC: ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ ΠΎΡΠ²Π΅ΡΠ° ΠΈΠ· ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΡΠ²Π΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ.
ViennaNET.CallContext
ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌΠΈ, Π½ΠΎ ΠΈ Π΄Π»Ρ ΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΡΠ°ΠΌΠΊΠ°Ρ
ΡΠ°Π³ΠΈ. ΠΡΠΎ ΠΏΡΠΈΠ²Π΅Π»ΠΎ ΠΊ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ°ΠΊΠΈΡ
Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ
Π΄Π°Π½Π½ΡΡ
, ΠΊΠ°ΠΊ Π»ΠΎΠ³ΠΈΠ½ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π·Π°ΠΏΡΠΎΡΠ° Π΄Π»Ρ ΡΠΊΠ²ΠΎΠ·Π½ΠΎΠ³ΠΎ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ip-Π°Π΄ΡΠ΅Ρ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΎΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅. ΠΠ»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΠ±ΡΠ°ΡΡΠ²Π°Π½ΠΈΡ ΡΡΠΈΡ
Π΄Π°Π½Π½ΡΡ
ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ ViennaNET.CallContext
, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Ρ
ΡΠ°Π½ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· Π²Ρ
ΠΎΠ΄ΡΡΠ΅Π³ΠΎ Π² ΡΠ΅ΡΠ²ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ°. ΠΡΠΈ ΡΡΠΎΠΌ ΡΠΎ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π±ΡΠ» ΡΠ΄Π΅Π»Π°Π½ Π·Π°ΠΏΡΠΎΡ, ΡΠ΅ΡΠ΅Π· ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅Π· Http, Π½Π΅ ΠΈΠ³ΡΠ°Π΅Ρ ΡΠΎΠ»ΠΈ. ΠΠ°ΡΠ΅ΠΌ, ΠΏΠ΅ΡΠ΅Π΄ ΠΎΡΠΏΡΠ°Π²ΠΊΠΎΠΉ ΠΈΡΡ
ΠΎΠ΄ΡΡΠ΅Π³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° ΠΈΠ»ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, Π΄ΠΎΡΡΠ°ΡΡΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΡΡ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ΅ΡΠ²ΠΈΡ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΈΠΌΠΈ ΡΠ°ΡΠΏΠΎΡΡΠΆΠ°Π΅ΡΡΡ.
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΆΠ΄ΡΠΌ Π²Π°ΡΠΈΡ
ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π² ΠΈ pull request-ΠΎΠ²!
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com