ΠΠ±ΡΠ½ΠΎΡΡΡΠ° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° Π Π°ΠΉΡΠ°ΠΉΠ·Π΅Π½Π±Π°Π½ΠΊ .NET ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π° Π΄Π° ΠΏΡΠ°Π²ΠΈ ΠΊΡΠ°ΡΡΠΊ ΠΏΡΠ΅Π³Π»Π΅Π΄ Π½Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ViennaNET. ΠΠ° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ ΠΈ Π·Π°ΡΠΎ ΡΡΠΈΠ³Π½Π°Ρ
ΠΌΠ΅ Π΄ΠΎ ΡΠΎΠ²Π°,
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ΡΠ°Π·Π³Π»Π΅Π΄Π°Π½ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, ΠΎΠΏΠ°ΡΠΊΠΈ ΠΈ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈ Π² Π½Π°ΡΠ΅ΡΠΎ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π° GitHub (
ViennaNET.Sagas
ΠΠΎΠ³Π°ΡΠΎ Π΄Π°Π΄Π΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ ΠΊΡΠΌ DDD ΠΈ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·Π½Π° Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°, ΡΠΎΠ³Π°Π²Π° ΠΊΠΎΠ³Π°ΡΠΎ Π±ΠΈΠ·Π½Π΅Ρ Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° ΡΠ΅ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΠ»ΡΠ³ΠΈ, Π²ΡΠ·Π½ΠΈΠΊΠ²Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΡΠ²ΡΡΠ·Π°Π½ Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΎΡ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΡΠΌ Π·Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠ΅Π½Π°ΡΠΈΠΈ ΡΠ΅ΡΡΠΎ Π·Π°ΡΡΠ³Π°Ρ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π΄ΠΎΠΌΠ΅ΠΉΠ½Π° Π½Π°Π²Π΅Π΄Π½ΡΠΆ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΡΠ΅ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Ρ ΡΠ°ΠΊΠΈΠ²Π° ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΠΈ, Π½Π°ΠΏΡ.
Π Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΡΠΌΠ΅ Π²Π½Π΅Π΄ΡΠΈΠ»ΠΈ ΠΏΡΠΎΡΡ, Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ: ΡΠ°Π³Π° ΠΈΠ»ΠΈ ΠΏΠΎ-ΡΠΊΠΎΡΠΎ ΡΠ°Π³Π°, Π±Π°Π·ΠΈΡΠ°Π½Π° Π½Π° ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΈΡ. Π‘ΡΡΠ½ΠΎΡΡΡΠ° ΠΌΡ Π΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ°: ΠΈΠΌΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ Π±ΠΈΠ·Π½Π΅Ρ ΡΡΠ΅Π½Π°ΡΠΈΠΉ, ΠΏΡΠΈ ΠΊΠΎΠΉΡΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΠ»ΡΠ³ΠΈ ΠΈ Π°ΠΊΠΎ Π²ΡΠ·Π½ΠΈΠΊΠ½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Π½Π° ΠΊΠΎΡΡΠΎ ΠΈ Π΄Π° Π΅ ΡΡΡΠΏΠΊΠ°, Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ° ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ°ΡΠ° Π·Π° Π²ΡΡΡΠ°Π½Π΅ Π½Π°Π·Π°Π΄ Π·Π° Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈ ΡΡΡΠΏΠΊΠΈ, ΠΊΡΠ΄Π΅ΡΠΎ Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ΠΈ. Π’Π°ΠΊΠ° Π² ΠΊΡΠ°Ρ Π½Π° ΡΠ°Π³Π°ΡΠ°, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΡΠΏΠ΅Ρ Π°, ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΈ Π΄Π°Π½Π½ΠΈ Π²ΡΠ² Π²ΡΠΈΡΠΊΠΈ ΠΎΠ±Π»Π°ΡΡΠΈ.
ΠΠ°ΡΠ°ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π²ΡΠ΅ ΠΎΡΠ΅ Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½Π° Π² ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΠΈ ΡΠΎΡΠΌΠ° ΠΈ Π½Π΅ Π΅ ΠΎΠ±Π²ΡΡΠ·Π°Π½Π° Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π΄ΡΡΠ³ΠΈ ΡΡΠ»ΡΠ³ΠΈ. ΠΠ΅ Π΅ ΡΡΡΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°: ΠΏΡΠΎΡΡΠΎ Π½Π°ΠΏΡΠ°Π²Π΅ΡΠ΅ ΠΏΠΎΡΠΎΠΌΡΠΊ Π½Π° Π±Π°Π·ΠΎΠ²ΠΈΡ Π°Π±ΡΡΡΠ°ΠΊΡΠ΅Π½ ΠΊΠ»Π°Ρ SagaBase<T>, ΠΊΡΠ΄Π΅ΡΠΎ T Π΅ Π²Π°ΡΠΈΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅Π½ ΠΊΠ»Π°Ρ, Π² ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π°ΡΠ΅ ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΡΠ°Π³Π°ΡΠ°, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π½ΡΠΊΠΎΠΈ ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ. ΠΠ½ΡΡΠ°Π½ΡΠΈΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΡΠ΅Π΄Π°Π΄Π΅Π½Π° Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΡΡΠΏΠΊΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅. Π‘Π°ΠΌΠ°ΡΠ° Saga Π΅ ΠΊΠ»Π°Ρ Π±Π΅Π· ΡΡΡΡΠΎΡΠ½ΠΈΠ΅, ΡΠ°ΠΊΠ° ΡΠ΅ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΡΡΠ°Π²Π΅Π½ Π² 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": "..."
}
],
ΠΡΠΈΠΌΠ΅ΡΠ΅Π½ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:
internal sealed class DbContext : ApplicationContext
{
public DbContext()
{
AddEntity<SomeEntity>("mssql_connection");
AddEntity<MigratedSomeEntity>("oracle_connection");
AddEntity<AnotherEntity>("oracle_connection");
}
}
ΠΠΊΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡΡ Π½Π° Π²ΡΡΠ·ΠΊΠ°ΡΠ° Π½Π΅ Π΅ ΠΏΠΎΡΠΎΡΠ΅Π½, ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π²ΡΡΠ·ΠΊΠ°ΡΠ° Ρ ΠΈΠΌΠ΅ βΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅β.
ΠΠΈΡΠ΅ΠΊΡΠ½ΠΎΡΠΎ ΠΊΠ°ΡΡΠΎΠ³ΡΠ°ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ ΠΊΡΠΌ ΡΠ°Π±Π»ΠΈΡΠΈ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π½Π° NHibernate. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΡΠΎ ΠΊΠ°ΠΊΡΠΎ ΡΡΠ΅Π· xml ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΡΠ°ΠΊΠ° ΠΈ ΡΡΠ΅Π· ΠΊΠ»Π°ΡΠΎΠ²Π΅. ΠΠ° ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠΈΡΠ°Π½Π΅ Π½Π° Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π·Π° ΠΌΡΠ½ΠΈΡΠ΅ΡΠ° Π² Unit tests ΠΈΠΌΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° 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, Π½ΡΠΌΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π°, ΠΏΡΠ΅Π΄ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° ΠΈΠ·Ρ
ΠΎΠ΄ΡΡΠ°ΡΠ° Π·Π°ΡΠ²ΠΊΠ° ΠΈΠ»ΠΈ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, Π΄Π°Π½Π½ΠΈΡΠ΅ ΡΠ΅ Π²Π·Π΅ΠΌΠ°Ρ ΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΠΈ ΡΠ΅ ΠΏΠΎΡΡΠ°Π²ΡΡ Π² Π·Π°Π³Π»Π°Π²ΠΊΠΈΡΠ΅. Π’Π°ΠΊΠ° ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΡΠ»ΡΠ³Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΡΠΏΠΎΠΌΠ°Π³Π°ΡΠ΅Π»Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ ΠΈ Π³ΠΈ ΡΠΏΡΠ°Π²Π»ΡΠ²Π° ΠΏΠΎ ΡΡΡΠΈΡ Π½Π°ΡΠΈΠ½.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠΈΠΌ Π²ΠΈ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ΡΠΎ, ΠΎΡΠ°ΠΊΠ²Π°ΠΌΠ΅ Π²Π°ΡΠΈΡΠ΅ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ ΠΈ Π·Π°ΡΠ²ΠΊΠΈ Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅!
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com