ViennaNET: Π·Π±ΠΈΡ€ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π·Π° Π·Π°Π΄Π½ΠΈΠΎΡ‚ Π΄Π΅Π». Π”Π΅Π» 2

Π—Π°Π΅Π΄Π½ΠΈΡ†Π°Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈ Π½Π° Raiffeisenbank .NET ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΡƒΠ²Π° Π½Π°ΠΊΡ€Π°Ρ‚ΠΊΠΎ Π΄Π° ја ΠΏΡ€Π΅Π³Π»Π΅Π΄ΡƒΠ²Π° содрТината Π½Π° ViennaNET. Π—Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ ΠΈ Π·ΠΎΡˆΡ‚ΠΎ дојдовмС Π΄ΠΎ ΠΎΠ²Π°, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚Π΅ ΠΏΡ€Π²ΠΈΠΎΡ‚ Π΄Π΅Π».

Π’ΠΎ овој напис, ќС ΠΏΠΎΠΌΠΈΠ½Π΅ΠΌΠ΅ Π½ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΊΠΎΠΈ Π΄ΠΎΠΏΡ€Π²Π° Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС Π·Π΅ΠΌΠ°Ρ‚ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° со дистрибуирани трансакции, Ρ€Π΅Π΄ΠΈΡ†ΠΈ ΠΈ Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, ΠΊΠΎΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°Ρ˜Π΄Π°Ρ‚ Π²ΠΎ Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅ Π½Π° GitHub (ΠΈΠ·Π²ΠΎΡ€ΠΈΡ‚Π΅ сС Ρ‚ΡƒΠΊΠ°), ΠΈ ΠΡƒΡŸΠ΅Ρ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ ΠΎΠ²Π΄Π΅.

ViennaNET: Π·Π±ΠΈΡ€ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π·Π° Π·Π°Π΄Π½ΠΈΠΎΡ‚ Π΄Π΅Π». Π”Π΅Π» 2

ВиСнаНЕВ.Π‘Π°Π³ΠΈ

Кога ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ ќС сС ΠΏΡ€Π΅Ρ„Ρ€Π»ΠΈ Π½Π° DDD ΠΈ микросСрвис Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°, Ρ‚ΠΎΠ³Π°Ρˆ ΠΊΠΎΠ³Π° Π΄Π΅Π»ΠΎΠ²Π½Π°Ρ‚Π° Π»ΠΎΠ³ΠΈΠΊΠ° сС дистрибуира Π½ΠΈΠ· Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ услуги, сС Ρ˜Π°Π²ΡƒΠ²Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΠΎΠ²Ρ€Π·Π°Π½ со ΠΏΠΎΡ‚Ρ€Π΅Π±Π°Ρ‚Π° Π΄Π° сС ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° дистрибуирана Ρ‚Ρ€Π°Π½ΡΠ°ΠΊΡ†ΠΈΡ˜Π°, бидСјќи ΠΌΠ½ΠΎΠ³Ρƒ ΡΡ†Π΅Π½Π°Ρ€ΠΈΡ˜Π° чСсто Π²Π»ΠΈΡ˜Π°Π°Ρ‚ Π½Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π΄ΠΎΠΌΠ΅Π½ΠΈ одСднаш. ΠœΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ΄Π΅Ρ‚Π°Π»Π½ΠΎ Π΄Π° сС Π·Π°ΠΏΠΎΠ·Π½Π°Π΅Ρ‚Π΅ со Ρ‚Π°ΠΊΠ²ΠΈΡ‚Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈ, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΎ ΠΊΠ½ΠΈΠ³Π°Ρ‚Π° β€žMicroservices Patternsβ€œ, ΠšΡ€ΠΈΡ Ричардсон.

Π’ΠΎ Π½Π°ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π²ΠΌΠ΅ СдноставСн, Π½ΠΎ корисСн ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·Π°ΠΌ: сага, ΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎ сага заснована Π½Π° ΠΎΡ€ΠΊΠ΅ΡΡ‚Ρ€Π°Ρ†ΠΈΡ˜Π°. НСговата ΡΡƒΡˆΡ‚ΠΈΠ½Π° Π΅ ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ слСдува: постои ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΎ Π΄Π΅Π»ΠΎΠ²Π½ΠΎ сцСнарио Π²ΠΎ ΠΊΠΎΠ΅ Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ послСдоватСлно ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ сСрвиси, ΠΈ Π΄ΠΎΠΊΠΎΠ»ΠΊΡƒ сС ΠΏΠΎΡ˜Π°Π²Π°Ρ‚ Π½Π΅ΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ Π½Π° кој Π±ΠΈΠ»ΠΎ Ρ‡Π΅ΠΊΠΎΡ€, ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ Π΅ Π΄Π° сС ΠΏΠΎΠ²ΠΈΠΊΠ° постапката Π·Π° Π²Ρ€Π°ΡœΠ°ΡšΠ΅ Π½Π°Π·Π°Π΄ Π·Π° ситС ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΈ Ρ‡Π΅ΠΊΠΎΡ€ΠΈ, ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ Π΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄Π΅Π½ΠΈ. Π’Π°ΠΊΠ°, Π½Π° ΠΊΡ€Π°Ρ˜ΠΎΡ‚ Π½Π° сагата, Π±Π΅Π· Ρ€Π°Π·Π»ΠΈΠΊΠ° Π½Π° успСхот, Π΄ΠΎΠ±ΠΈΠ²Π°ΠΌΠ΅ конзистСнтни ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π²ΠΎ ситС Π΄ΠΎΠΌΠ΅Π½ΠΈ.

ΠΠ°ΡˆΠ°Ρ‚Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° сè ΡƒΡˆΡ‚Π΅ Π΅ Π½Π°ΠΏΡ€Π°Π²Π΅Π½Π° Π²ΠΎ Π½Π΅Ρ˜Π·ΠΈΠ½Π°Ρ‚Π° основна Ρ„ΠΎΡ€ΠΌΠ° ΠΈ Π½Π΅ Π΅ ΠΏΠΎΠ²Ρ€Π·Π°Π½Π° со ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π½Π° ΠΊΠ°ΠΊΠ²ΠΈ Π±ΠΈΠ»ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ†ΠΈΡ˜Π° со Π΄Ρ€ΡƒΠ³ΠΈ услуги. НС Π΅ Ρ‚Π΅ΡˆΠΊΠΎ Π΄Π° сС користи: само Π½Π°ΠΏΡ€Π°Π²Π΅Ρ‚Π΅ ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ Π½Π° основната апстрактна класа 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

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€