ΠΠ°Π΅Π΄Π½ΠΈΡΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΈ Π½Π° Raiffeisenbank .NET ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΡΠ²Π° Π½Π°ΠΊΡΠ°ΡΠΊΠΎ Π΄Π° ΡΠ° ΠΏΡΠ΅Π³Π»Π΅Π΄ΡΠ²Π° ΡΠΎΠ΄ΡΠΆΠΈΠ½Π°ΡΠ° Π½Π° ViennaNET. ΠΠ° ΡΠΎΠ° ΠΊΠ°ΠΊΠΎ ΠΈ Π·ΠΎΡΡΠΎ Π΄ΠΎΡΠ΄ΠΎΠ²ΠΌΠ΅ Π΄ΠΎ ΠΎΠ²Π°,
ΠΠΎ ΠΎΠ²ΠΎΡ Π½Π°ΠΏΠΈΡ, ΡΠ΅ ΠΏΠΎΠΌΠΈΠ½Π΅ΠΌΠ΅ Π½ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΊΠΎΠΈ Π΄ΠΎΠΏΡΠ²Π° ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ Π·Π΅ΠΌΠ°Ρ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ Π·Π° ΡΠ°Π±ΠΎΡΠ° ΡΠΎ Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½ΠΈ ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ, ΡΠ΅Π΄ΠΈΡΠΈ ΠΈ Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, ΠΊΠΎΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΄Π°Ρ Π²ΠΎ Π½Π°ΡΠ΅ΡΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ Π½Π° GitHub (
ΠΠΈΠ΅Π½Π°ΠΠΠ’.Π‘Π°Π³ΠΈ
ΠΠΎΠ³Π° ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ ΡΠ΅ ΡΠ΅ ΠΏΡΠ΅ΡΡΠ»ΠΈ Π½Π° DDD ΠΈ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°, ΡΠΎΠ³Π°Ρ ΠΊΠΎΠ³Π° Π΄Π΅Π»ΠΎΠ²Π½Π°ΡΠ° Π»ΠΎΠ³ΠΈΠΊΠ° ΡΠ΅ Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ° Π½ΠΈΠ· ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΠ»ΡΠ³ΠΈ, ΡΠ΅ ΡΠ°Π²ΡΠ²Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΏΠΎΠ²ΡΠ·Π°Π½ ΡΠΎ ΠΏΠΎΡΡΠ΅Π±Π°ΡΠ° Π΄Π° ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ° ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½Π° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠ°, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΠΌΠ½ΠΎΠ³Ρ ΡΡΠ΅Π½Π°ΡΠΈΡΠ° ΡΠ΅ΡΡΠΎ Π²Π»ΠΈΡΠ°Π°Ρ Π½Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π΄ΠΎΠΌΠ΅Π½ΠΈ ΠΎΠ΄Π΅Π΄Π½Π°Ρ. ΠΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ΄Π΅ΡΠ°Π»Π½ΠΎ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΡΠ΅ ΡΠΎ ΡΠ°ΠΊΠ²ΠΈΡΠ΅ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΠΈ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ,
ΠΠΎ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π²ΠΌΠ΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π΅Π½, Π½ΠΎ ΠΊΠΎΡΠΈΡΠ΅Π½ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·Π°ΠΌ: ΡΠ°Π³Π°, ΠΏΠΎΡΠΎΡΠ½ΠΎ ΡΠ°Π³Π° Π·Π°ΡΠ½ΠΎΠ²Π°Π½Π° Π½Π° ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΈΡΠ°. ΠΠ΅Π³ΠΎΠ²Π°ΡΠ° ΡΡΡΡΠΈΠ½Π° Π΅ ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ»Π΅Π΄ΡΠ²Π°: ΠΏΠΎΡΡΠΎΠΈ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΎ Π΄Π΅Π»ΠΎΠ²Π½ΠΎ ΡΡΠ΅Π½Π°ΡΠΈΠΎ Π²ΠΎ ΠΊΠΎΠ΅ Π΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π²ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠ΅ΡΠ²ΠΈΡΠΈ, ΠΈ Π΄ΠΎΠΊΠΎΠ»ΠΊΡ ΡΠ΅ ΠΏΠΎΡΠ°Π²Π°Ρ Π½Π΅ΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Π½Π° ΠΊΠΎΡ Π±ΠΈΠ»ΠΎ ΡΠ΅ΠΊΠΎΡ, ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠ²ΠΈΠΊΠ° ΠΏΠΎΡΡΠ°ΠΏΠΊΠ°ΡΠ° Π·Π° Π²ΡΠ°ΡΠ°ΡΠ΅ Π½Π°Π·Π°Π΄ Π·Π° ΡΠΈΡΠ΅ ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΈ ΡΠ΅ΠΊΠΎΡΠΈ, ΠΊΠ°Π΄Π΅ ΡΡΠΎ Π΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄Π΅Π½ΠΈ. Π’Π°ΠΊΠ°, Π½Π° ΠΊΡΠ°ΡΠΎΡ Π½Π° ΡΠ°Π³Π°ΡΠ°, Π±Π΅Π· ΡΠ°Π·Π»ΠΈΠΊΠ° Π½Π° ΡΡΠΏΠ΅Ρ ΠΎΡ, Π΄ΠΎΠ±ΠΈΠ²Π°ΠΌΠ΅ ΠΊΠΎΠ½Π·ΠΈΡΡΠ΅Π½ΡΠ½ΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π²ΠΎ ΡΠΈΡΠ΅ Π΄ΠΎΠΌΠ΅Π½ΠΈ.
ΠΠ°ΡΠ°ΡΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° ΡΓ¨ ΡΡΡΠ΅ Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½Π° Π²ΠΎ Π½Π΅ΡΠ·ΠΈΠ½Π°ΡΠ° ΠΎΡΠ½ΠΎΠ²Π½Π° ΡΠΎΡΠΌΠ° ΠΈ Π½Π΅ Π΅ ΠΏΠΎΠ²ΡΠ·Π°Π½Π° ΡΠΎ ΡΠΏΠΎΡΡΠ΅Π±Π° Π½Π° ΠΊΠ°ΠΊΠ²ΠΈ Π±ΠΈΠ»ΠΎ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π½Π° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΡΠ° ΡΠΎ Π΄ΡΡΠ³ΠΈ ΡΡΠ»ΡΠ³ΠΈ. ΠΠ΅ Π΅ ΡΠ΅ΡΠΊΠΎ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ: ΡΠ°ΠΌΠΎ Π½Π°ΠΏΡΠ°Π²Π΅ΡΠ΅ ΠΏΠΎΡΠΎΠΌΠΎΠΊ Π½Π° ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° Π°ΠΏΡΡΡΠ°ΠΊΡΠ½Π° ΠΊΠ»Π°ΡΠ° SagaBase<T>, ΠΊΠ°Π΄Π΅ ΡΡΠΎ T Π΅ Π²Π°ΡΠ°ΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½Π° ΠΊΠ»Π°ΡΠ° Π²ΠΎ ΠΊΠΎΡΠ° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΈ ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ ΠΏΠΎΡΠ΅ΡΠ½ΠΈΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° ΡΠ°Π³Π°ΡΠ°, ΠΊΠ°ΠΊΠΎ ΠΈ Π½Π΅ΠΊΠΎΠΈ ΡΡΠ΅Π΄Π½ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ. ΠΠΎΠ½ΡΠ΅ΠΊΡΠ½Π°ΡΠ° ΠΈΠ½ΡΡΠ°Π½ΡΠ° ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΏΡΠ΅Π½Π΅ΡΠ΅Π½Π° Π½Π° ΡΠΈΡΠ΅ ΡΠ΅ΠΊΠΎΡΠΈ Π·Π° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ. Π‘Π°ΠΌΠ°ΡΠ° ΡΠ°Π³Π° Π΅ ΠΊΠ»Π°ΡΠ° Π±Π΅Π· Π΄ΡΠΆΠ°Π²ΡΠ°Π½ΡΡΠ²ΠΎ, ΡΠ°ΠΊΠ° ΡΡΠΎ ΠΈΠ½ΡΡΠ°Π½ΡΠ°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΡΠ°Π²ΠΈ Π²ΠΎ 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
ΡΠ΅ Π³Π»Π°Π²Π½Π°ΡΠ° ΠΏΠΎΡΠ΅ΡΠ½Π° ΡΠΎΡΠΊΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ° ΡΠΎ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΡΡΠΊΠ° ΡΠ΅ ΠΊΡΠ΅ΠΈΡΠ°Π°Ρ ΠΠ΄ΠΈΠ½ΠΈΡΠ°ΡΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ°, ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ° ΡΠΎ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ Π΅Π½ΡΠΈΡΠ΅ΡΠΈ, ΠΊΠ°ΠΊΠΎ ΠΈ ΠΈΠ·Π²ΡΡΠΈΡΠ΅Π»ΠΈ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΈ SQL Π±Π°ΡΠ°ΡΠ°. ΠΠΎΠ½Π΅ΠΊΠΎΠ³Π°Ρ Π΅ ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ°Ρ ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΊΠ»Π°ΡΠ°ΡΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ° ΡΠΎ Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π° ΡΠ΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈ ΠΌΠΎΠΆΠ½ΠΎΡΡ ΡΠ°ΠΌΠΎ Π·Π° ΡΠΈΡΠ°ΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠ° Π²Π°ΠΊΠ²ΠΈ ΡΠ»ΡΡΠ°ΠΈ IEntityFactoryService
ΠΈΠΌΠ° ΠΏΡΠ΅Π΄ΠΎΠΊ - ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡ IEntityRepositoryFactory
, ΠΊΠΎΡ ΡΠ°ΠΌΠΎ Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ° ΠΌΠ΅ΡΠΎΠ΄ Π·Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ°.
ΠΠ° Π΄ΠΈΡΠ΅ΠΊΡΠ΅Π½ ΠΏΡΠΈΡΡΠ°ΠΏ Π΄ΠΎ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΠΎΡ Π½Π° ΠΏΡΠΎΠ²Π°ΡΠ΄Π΅ΡΠΎΡ. Π‘Π΅ΠΊΠΎΡ DBMS ΡΡΠΎ Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ Π²ΠΎ Π½Π°ΡΠΈΡΠ΅ ΡΠΈΠΌΠΎΠ²ΠΈ ΠΈΠΌΠ° ΡΠ²ΠΎΡΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql
.
ΠΠΎ ΠΈΡΡΠΎ Π²ΡΠ΅ΠΌΠ΅, Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΏΡΠΎΠ²Π°ΡΠ΄Π΅ΡΠΈ ΠΌΠΎΠΆΠ°Ρ Π΄Π° ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π°Ρ Π²ΠΎ Π΅Π΄Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΈΡΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½ΠΎ, ΡΡΠΎ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π°, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΠΎ ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° Π΅Π΄Π½Π° ΡΡΠ»ΡΠ³Π°, Π±Π΅Π· Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΡΡΠΎΡΠΎΡΠΈ Π·Π° ΠΏΡΠΎΠΌΠ΅Π½Π° Π½Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°, Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΠΈ ΡΠ΅ΠΊΠΎΡ-ΠΏΠΎ-ΡΠ΅ΠΊΠΎΡ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡΠ° ΠΎΠ΄ Π΅Π΄Π΅Π½ DBMS Π²ΠΎ Π΄ΡΡΠ³. ΠΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΡ Π·Π° ΠΈΠ·Π±ΠΎΡ Π½Π° ΠΏΠΎΡΡΠ΅Π±Π½Π°ΡΠ° Π²ΡΡΠΊΠ° ΠΈ, ΡΠΏΠΎΡΠ΅Π΄ ΡΠΎΠ°, ΠΏΡΠΎΠ²Π°ΡΠ΄Π΅ΡΠΎΡ Π·Π° ΠΎΠ΄ΡΠ΅Π΄Π΅Π½Π° ΠΊΠ»Π°ΡΠ° Π½Π° Π΅Π½ΡΠΈΡΠ΅ΡΠΈ (Π·Π° ΠΊΠΎΡΠ° Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ ΠΌΠ°ΠΏΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠ°Π±Π΅Π»ΠΈΡΠ΅ Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ) ΡΠ΅ ΡΠΏΡΠΎΠ²Π΅Π΄ΡΠ²Π° ΠΏΡΠ΅ΠΊΡ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΡΠ΅ Π½Π° Π΅Π½ΡΠΈΡΠ΅ΡΠΎΡ Π²ΠΎ ΠΊΠ»Π°ΡΠ°ΡΠ° 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");
}
}
ΠΠΊΠΎ ID Π½Π° Π²ΡΡΠΊΠ°ΡΠ° Π½Π΅ Π΅ Π½Π°Π²Π΅Π΄Π΅Π½, ΡΠΎΠ³Π°Ρ ΡΠ΅ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π²ΡΡΠΊΠ°ΡΠ° ΡΠΎ ΠΈΠΌΠ΅ βΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΎβ.
ΠΠΈΡΠ΅ΠΊΡΠ½ΠΎΡΠΎ ΠΌΠ°ΠΏΠΈΡΠ°ΡΠ΅ Π½Π° Π΅Π½ΡΠΈΡΠ΅ΡΠΈΡΠ΅ Π½Π° ΡΠ°Π±Π΅Π»ΠΈΡΠ΅ ΡΠΎ Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΡΠ΅ ΡΠΏΡΠΎΠ²Π΅Π΄ΡΠ²Π° ΡΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΈ NHibernate Π°Π»Π°ΡΠΊΠΈ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΠΎΠΏΠΈΡΠΎΡ ΠΈ ΠΏΡΠ΅ΠΊΡ xml-Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ ΠΈ ΠΏΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΠΈ. ΠΠ° ΠΏΡΠ°ΠΊΡΠΈΡΠ½ΠΎ ΠΏΠΈΡΡΠ²Π°ΡΠ΅ Π½Π° ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ° Π·Π° Π½ΠΈΠΊΡΠ»ΡΠΈ Π²ΠΎ Unit ΡΠ΅ΡΡΠΎΠ²ΠΈ, ΠΏΠΎΡΡΠΎΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ViennaNET.TestUtils.Orm
.
ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΄Π°Ρ ΡΠ΅Π»ΠΎΡΠ½ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ViennaNET.Orm.*
ViennaNET.ΠΠΎΡΠ°ΠΊΠΈ.*
ΠΠ±ΠΈΡ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° ΡΠΎ ΡΠ΅Π΄ΠΈΡΠΈ.
ΠΠ° ΡΠ°Π±ΠΎΡΠ° ΡΠΎ ΡΠ΅Π΄ΠΈΡΠΈ, Π±Π΅ΡΠ΅ ΠΈΠ·Π±ΡΠ°Π½ ΠΈΡΡΠΈΠΎΡ ΠΏΡΠΈΡΡΠ°ΠΏ ΠΊΠ°ΠΊΠΎ ΠΊΠ°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈΡΠ΅ DBMS, ΠΈΠΌΠ΅Π½ΠΎ, ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΈΠΎΡ ΠΌΠΎΠΆΠ΅Π½ ΡΠ½ΠΈΡΠΈΡΠΈΡΠ°Π½ ΠΏΡΠΈΡΡΠ°ΠΏ Π²ΠΎ ΠΎΠ΄Π½ΠΎΡ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΡΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ°, Π±Π΅Π· ΠΎΠ³Π»Π΅Π΄ Π½Π° ΠΊΠΎΡΠΈΡΡΠ΅Π½ΠΈΠΎΡ ΠΌΠ΅Π½Π°ΡΠ΅Ρ Π½Π° ΡΠ΅Π΄ΠΈΡΠΈ. ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° 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