ViennaNET: Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π·Π° Π±Π΅ΠΊΠ΅Π½Π΄Π°. Част 2

ΠžΠ±Ρ‰Π½ΠΎΡΡ‚Ρ‚Π° Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Π Π°ΠΉΡ„Π°ΠΉΠ·Π΅Π½Π±Π°Π½ΠΊ .NET ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π° Π΄Π° ΠΏΡ€Π°Π²ΠΈ ΠΊΡ€Π°Ρ‚ΡŠΠΊ ΠΏΡ€Π΅Π³Π»Π΅Π΄ Π½Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ViennaNET. Π—Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ ΠΈ Π·Π°Ρ‰ΠΎ стигнахмС Π΄ΠΎ Ρ‚ΠΎΠ²Π°, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ ΠΏΡŠΡ€Π²Π°Ρ‚Π° част.

Π’ Ρ‚Π°Π·ΠΈ статия Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ всС ΠΎΡ‰Π΅ Π½Π΅Ρ€Π°Π·Π³Π»Π΅Π΄Π°Π½ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, опашки ΠΈ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈ Π² Π½Π°ΡˆΠ΅Ρ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π½Π° GitHub (ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΡ†ΠΈΡ‚Π΅ са Ρ‚ΡƒΠΊ), ΠΈ Nuget ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Ρ‚ΡƒΠΊ.

ViennaNET: Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π·Π° Π±Π΅ΠΊΠ΅Π½Π΄Π°. Част 2

ViennaNET.Sagas

ΠšΠΎΠ³Π°Ρ‚ΠΎ Π΄Π°Π΄Π΅Π½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ към DDD ΠΈ микросСрвизна Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°, Ρ‚ΠΎΠ³Π°Π²Π° ΠΊΠΎΠ³Π°Ρ‚ΠΎ бизнСс Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° сС разпрСдСля ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ услуги, възниква ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΡΠ²ΡŠΡ€Π·Π°Π½ с нСобходимостта ΠΎΡ‚ внСдряванС Π½Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Π·Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ сцСнарии чСсто засягат няколко Π΄ΠΎΠΌΠ΅ΠΉΠ½Π° навСднъТ. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° сС Π·Π°ΠΏΠΎΠ·Π½Π°Π΅Ρ‚Π΅ ΠΏΠΎ-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ с Ρ‚Π°ΠΊΠΈΠ²Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈ, Π½Π°ΠΏΡ€. Π² ΠΊΠ½ΠΈΠ³Π°Ρ‚Π° "Microservices Patterns", ΠšΡ€ΠΈΡ Π ΠΈΡ‡Π°Ρ€Π΄ΡΡŠΠ½.

Π’ Π½Π°ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ смС Π²Π½Π΅Π΄Ρ€ΠΈΠ»ΠΈ прост, Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ: сага ΠΈΠ»ΠΈ ΠΏΠΎ-скоро сага, Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° оркСстрация. Π‘ΡŠΡ‰Π½ΠΎΡΡ‚Ρ‚Π° ΠΌΡƒ Π΅ слСдната: ΠΈΠΌΠ° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ бизнСс сцСнарий, ΠΏΡ€ΠΈ ΠΊΠΎΠΉΡ‚ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ послСдоватСлно Π΄Π° сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ услуги ΠΈ Π°ΠΊΠΎ Π²ΡŠΠ·Π½ΠΈΠΊΠ½Π°Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ Π½Π° която ΠΈ Π΄Π° Π΅ ΡΡ‚ΡŠΠΏΠΊΠ°, Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° сС ΠΈΠ·Π²ΠΈΠΊΠ° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°Ρ‚Π° Π·Π° Π²Ρ€ΡŠΡ‰Π°Π½Π΅ Π½Π°Π·Π°Π΄ Π·Π° всички ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈ ΡΡ‚ΡŠΠΏΠΊΠΈ, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Π΅ прСдоставСни. Π’Π°ΠΊΠ° Π² края Π½Π° сагата, нСзависимо ΠΎΡ‚ успСха, ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ послСдоватСлни Π΄Π°Π½Π½ΠΈ във всички области.

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€