ViennaNET: เบŠเบธเบ”เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบชเปเบฒเบฅเบฑเบš backend เป„เบ”เป‰. เบžเบฒเบเบ—เบต 2

เบŠเบธเบกเบŠเบปเบ™เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ Raiffeisenbank .NET เบชเบทเบšเบ•เปเปˆเบ—เบปเบšเบ—เบงเบ™เป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡ ViennaNET เป‚เบ”เบเบซเบเปเป‰. เบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เปเบฅเบฐเป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบžเบงเบเป€เบฎเบปเบฒเบกเบฒเบ™เบตเป‰, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เบžเบฒเบเบ—เปเบฒเบญเบดเบ”.

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบœเปˆเบฒเบ™เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ—เบตเปˆเบเบฑเบ‡เบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ—เบธเบฅเบฐเบเปเบฒเปเบˆเบเบขเบฒเบ, เปเบ–เบงเปเบฅเบฐเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เป€เบŠเบดเปˆเบ‡เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰เบขเบนเปˆเปƒเบ™เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™ GitHub เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ (เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เปเบกเปˆเบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰), เบ เปเบžเบฑเบเป€เบเบ” Nuget เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰.

ViennaNET: เบŠเบธเบ”เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบชเปเบฒเบฅเบฑเบš backend เป„เบ”เป‰. เบžเบฒเบเบ—เบต 2

ViennaNET.Sagas

เป€เบกเบทเปˆเบญเป‚เบ„เบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เป„เบ›เปƒเบŠเป‰ DDD เปเบฅเบฐเบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒเบˆเบธเบฅเบฐเบžเบฒเบ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป€เบซเบ”เบœเบปเบ™เบ—เบฒเบ‡เบ—เบธเบฅเบฐเบเบดเบ”เบ–เบทเบเปเบˆเบเบขเบฒเบเปƒเบ™เบ—เบปเปˆเบงเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเป€เบเบตเบ”เบ‚เบทเป‰เบ™เบเบฑเบšเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบปเบ™เป„เบเบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบ—เบตเปˆเปเบˆเบเบขเบฒเบ, เป€เบžเบฒเบฐเบงเปˆเบฒเบซเบผเบฒเบเป†เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบกเบฑเบเบˆเบฐเบชเบปเปˆเบ‡เบœเบปเบ™เบเบฐเบ—เบปเบšเบ•เปเปˆเบซเบฅเบฒเบเป‚เบ”เป€เบกเบ™เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบฎเบนเป‰เบˆเบฑเบเบเบฑเบšเบเบปเบ™เป„เบเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบก, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เปƒเบ™เบ›เบถเป‰เบก "เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบˆเบธเบฅเบฐเบžเบฒเบ", Chris Richardson.

เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบปเบ™เป„เบเบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเปเบ•เปˆเบกเบตเบ›เบฐเป‚เบซเบเบ”: saga, เบซเบผเบทเปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™ saga เบญเบตเบ‡เปƒเบชเปˆ orchestration. เป‚เบ”เบเป€เบ™เบทเป‰เบญเปเบ—เป‰เปเบฅเป‰เบงเบ‚เบญเบ‡เบกเบฑเบ™เปเบกเปˆเบ™เบ”เบฑเปˆเบ‡เบ™เบตเป‰: เบกเบตเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบธเบฅเบฐเบเบดเบ”เบชเบฐเป€เบžเบฒเบฐเปƒเบ”เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบšเปƒเบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เปเบฅเบฐเบ–เป‰เบฒเบšเบฑเบ™เบซเบฒเปƒเบ”เป†เป€เบเบตเบ”เบ‚เบทเป‰เบ™เปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป‚เบ—เบซเบฒเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบเบฒเบ™เบเบฑเบšเบ„เบทเบ™เบชเปเบฒเบฅเบฑเบšเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”, เบšเปˆเบญเบ™เบ—เบตเปˆเบกเบฑเบ™เบขเบนเปˆ. เบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบเบ‚เบญเบ‡ saga, เป‚เบ”เบเบšเปเปˆเบ„เปเบฒเบ™เบถเบ‡เป€เบ–เบดเบ‡เบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบชเบญเบ”เบ„เปˆเบญเบ‡เปƒเบ™เบ—เบธเบเป‚เบ”เป€เบกเบ™.

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบกเปˆเบ™เบเบฑเบ‡เป€เบฎเบฑเบ”เบขเบนเปˆเปƒเบ™เบฎเบนเบšเปเบšเบšเบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบกเบฑเบ™ เปเบฅเบฐเบšเปเปˆเป„เบ”เป‰เบ•เบดเบ”เบžเบฑเบ™เบเบฑเบšเบเบฒเบ™เปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™เบžเบปเบงเบžเบฑเบ™เปƒเบ”เป†เบเบฑเบšเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบญเบทเปˆเบ™เป†. เบกเบฑเบ™เบšเปเปˆเบเบฒเบเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰: เบžเบฝเบ‡เปเบ•เปˆเป€เบฎเบฑเบ”เปƒเบซเป‰เบฅเบนเบเบซเบฅเบฒเบ™เบ‚เบญเบ‡เบŠเบฑเป‰เบ™เบฎเบฝเบ™เบ—เบตเปˆเบšเปเปˆเบกเบตเบ•เบปเบงเบ•เบปเบ™ SagaBase<T>, เบšเปˆเบญเบ™เบ—เบตเปˆ T เปเบกเปˆเบ™เบซเป‰เบญเบ‡เบฎเบฝเบ™เบชเบฐเบžเบฒเบšเบเบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบชเปเบฒเบฅเบฑเบš saga เป€เบฎเบฑเบ”เบงเบฝเบ, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบšเบฒเบ‡เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบฅเบฐเบ”เบฑเบšเบ›เบฒเบ™เบเบฒเบ‡. เบชเบฐเบžเบฒเบšเบเบฒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เบœเปˆเบฒเบ™เป„เบ›เบ—เบธเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”. 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 เป€เบ›เบฑเบ™เบˆเบธเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ•เบปเป‰เบ™เบ•เปเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบ, repositories เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบชเบฐเป€เบžเบฒเบฐ, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบœเบนเป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เปเบฅเบฐเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก SQL เป‚เบ”เบเบเบปเบ‡เปเบกเปˆเบ™เบชเป‰เบฒเบ‡เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰. เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบกเบฑเบ™เบชเบฐเบ”เบงเบเบ—เบตเปˆเบˆเบฐเบˆเปเบฒเบเบฑเบ”เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เบ•เบปเบงเบขเปˆเบฒเบ‡, เบชเบฐเบซเบ™เบญเบ‡เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบญเปˆเบฒเบ™เบ‚เปเป‰เบกเบนเบ™เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™. เบชเปเบฒเบฅเบฑเบšเบเปเบฅเบฐเบ™เบตเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง IEntityFactoryService เบกเบตเบšเบฑเบ™เบžเบฐเบšเบธเบฅเบธเบ” - เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš IEntityRepositoryFactory, เป€เบŠเบดเปˆเบ‡เบžเบฝเบ‡เปเบ•เปˆเบ›เบฐเบเบฒเบ”เบงเบดเบ—เบตเบเบฒเบ™เบชเป‰เบฒเบ‡ repositories.

เป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เป‚เบ”เบเบเบปเบ‡, เบเบปเบ™เป„เบเบœเบนเป‰เปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰. เปเบ•เปˆเบฅเบฐ DBMS เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เบขเบนเปˆเปƒเบ™เบ—เบตเบกเบ‡เบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™, เบœเบนเป‰เปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เบซเบผเบฒเบเป†เบ„เบปเบ™เบชเบฒเบกเบฒเบ”เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบขเบนเปˆเปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบซเบ™เบถเปˆเบ‡เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™, เป€เบŠเบดเปˆเบ‡เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰, เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡, เบžเบฒเบเปƒเบ™เบเบญเบšเบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบซเบ™เบถเปˆเบ‡, เป‚เบ”เบเบšเปเปˆเบกเบตเบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบเปƒเบ”เป†เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ”เบฑเบ”เปเบ›เบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™, เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™เป‚เบ”เบเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบˆเบฒเบ. เบซเบ™เบถเปˆเบ‡ DBMS เบเบฑเบšเบญเบตเบ. เบเบปเบ™เป„เบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฅเบทเบญเบเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เปเบฅเบฐเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบœเบนเป‰เปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบŠเบฑเป‰เบ™ entity เบชเบฐเป€เบžเบฒเบฐ (เบชเปเบฒเบฅเบฑเบšเปเบœเบ™เบ—เบตเปˆเบเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปเบกเปˆเบ™เบ‚เบฝเบ™) เปเบกเปˆเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™ entity เปƒเบ™ BoundedContext class (เบกเบตเบงเบดเบ—เบตเบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เป‚เบ”เป€เบกเบ™) เบซเบผเบทเบœเบนเป‰เบชเบทเบšเบ—เบญเบ”เบ‚เบญเบ‡เบกเบฑเบ™. 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 เปเบฅเบฐเบœเปˆเบฒเบ™เบซเป‰เบญเบ‡เบฎเบฝเบ™. เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ‚เบฝเบ™เบ—เบตเปˆเบชเบฐเบ”เบงเบเบ‚เบญเบ‡ stub repositories เปƒเบ™ Unit tests, เบกเบตเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” ViennaNET.TestUtils.Orm.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบญเบฑเบ™เป€เบ•เบฑเบกเบ—เบตเปˆเบ‚เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰ ViennaNET.Orm.* เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰ เบ—เบตเปˆเบ™เบตเป‰.

ViennaNET.เบเบฒเบ™เบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก.*

เบŠเบธเบ”เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ„เบดเบง.

เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ„เบดเบง, เบงเบดเบ—เบตเบเบฒเบ™เบ”เบฝเบงเบเบฑเบ™เป„เบ”เป‰เบ–เบทเบเป€เบฅเบทเบญเบเป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบš DBMSs เบ•เปˆเบฒเบ‡เป†, เบ„เบท, เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เป€เบญเบเบฐเบžเบฒเบšเบชเบนเบ‡เบชเบธเบ”เบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เปƒเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”, เบšเปเปˆเบงเปˆเบฒเบˆเบฐเป€เบ›เบฑเบ™เบœเบนเป‰เบˆเบฑเบ”เบเบฒเบ™เบ„เบดเบงเบ—เบตเปˆเปƒเบŠเป‰. เบซเปเบชเบฐเปเบธเบ” 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 = ...});
}

เบกเบตเบชเบฒเบกเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบžเป‰เบญเบกเบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™ serializing เปเบฅเบฐ deserializing เบ‚เปเป‰เบ„เบงเบฒเบก: เบžเบฝเบ‡เปเบ•เปˆเบ‚เปเป‰เบ„เบงเบฒเบก, XML เปเบฅเบฐ JSON, เปเบ•เปˆเบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบกเบตเบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡เป„เบ”เป‰เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ. IMessageSerializer ะธ IMessageDeserializer.

เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบžเบฐเบเบฒเบเบฒเบกเบฎเบฑเบเบชเบฒเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบžเบดเป€เบชเบ”เบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐเบœเบนเป‰เบˆเบฑเบ”เบเบฒเบ™เปเบ–เบง, e.g. ViennaNET.Messaging.MQSeriesQueue เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆ, เปเบ•เปˆเบเบฑเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก byte, เปเบฅเบฐ ViennaNET.Messaging.RabbitMQQueue เบชเบฐโ€‹เบซเบ™เบฑเบšโ€‹เบชเบฐโ€‹เบซเบ™เบนเบ™โ€‹เบเบฒเบ™โ€‹เป€เบชเบฑเป‰เบ™โ€‹เบ—เบฒเบ‡โ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบ•เปเปˆโ€‹เบ„เบดเบงโ€‹เบšเบดเบ™โ€‹. wrapper เบญเบฐเปเบ”เบšเป€เบ•เบตเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบชเปเบฒเบฅเบฑเบš RabbitMQ เบเบฑเบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบšเบฒเบ‡เบฅเบฑเบเบชเบฐเบ™เบฐเบ‚เบญเบ‡ RPC: เบžเบงเบเป€เบฎเบปเบฒเบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเปเบฅเบฐเบฅเปเบ–เป‰เบฒเบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบˆเบฒเบเปเบ–เบงเบŠเบปเปˆเบงเบ„เบฒเบงเบžเบดเป€เบชเบ”, เป€เบŠเบดเปˆเบ‡เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบซเบ™เบถเปˆเบ‡เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™.

เบ—เบตเปˆเบ™เบตเป‰ เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เปเบ–เบงเบ—เบตเปˆเบกเบต nuances เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบžเบทเป‰เบ™เบ–เบฒเบ™.

ViennaNET.CallContext

เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เบ„เบดเบงเบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เบฅเบฐเบซเบงเปˆเบฒเบ‡เบฅเบฐเบšเบปเบšเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เปเบ•เปˆเบเบฑเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡ microservices เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ”เบฝเบงเบเบฑเบ™, เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡, เบžเบฒเบเปƒเบ™ saga. เบญเบฑเบ™เบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบชเบปเปˆเบ‡เบžเป‰เบญเบกเบเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบ‚เปเป‰เบกเบนเบ™เบŠเปˆเบงเบเป€เบŠเบฑเปˆเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰, เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบ, เบ—เบตเปˆเบขเบนเปˆ IP เปเบซเบผเปˆเบ‡เปเบฅเบฐเบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”. เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบชเบปเปˆเบ‡เบ•เปเปˆเบ‚เปเป‰เบกเบนเบ™เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” ViennaNET.CallContext, เป€เบŠเบดเปˆเบ‡เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบกเบฒเปƒเบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบงเบดเบ—เบตเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเป„เบ”เป‰เบ–เบทเบเบ”เปเบฒเป€เบ™เบตเบ™, เบœเปˆเบฒเบ™เปเบ–เบงเบซเบผเบทเบœเปˆเบฒเบ™ Http, เบšเปเปˆเบชเปเบฒเบ„เบฑเบ™. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบชเบปเปˆเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบซเบผเบทเบ‚เปเป‰เบ„เบงเบฒเบกเบญเบญเบ, เบ‚เปเป‰เบกเบนเบ™เบ–เบทเบเป€เบญเบปเบฒเบกเบฒเบˆเบฒเบเบชเบฐเบžเบฒเบšเบเบฒเบ™เปเบฅเบฐเบงเบฒเบ‡เป„เบงเป‰เปƒเบ™เบซเบปเบง. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ•เปเปˆเป„เบ›เป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบŠเปˆเบงเบเปเบฅเบฐเบ„เบธเป‰เบกเบ„เบญเบ‡เบกเบฑเบ™เปƒเบ™เบ—เบฒเบ‡เบ”เบฝเบงเบเบฑเบ™.

เบ‚เปโ€‹เบ‚เบญเบšโ€‹เปƒเบˆโ€‹เบ—เปˆเบฒเบ™โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบ„เบงเบฒเบกโ€‹เบชเบปเบ™โ€‹เปƒเบˆโ€‹เบ‚เบญเบ‡โ€‹เบ—เปˆเบฒเบ™โ€‹, เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบซเบงเบฑเบ‡โ€‹เบงเปˆเบฒโ€‹เบ—เปˆเบฒเบ™โ€‹เบˆเบฐโ€‹เบกเบตโ€‹เบ„เปเบฒโ€‹เป€เบซเบฑเบ™โ€‹เปเบฅเบฐโ€‹เบ”เบถเบ‡โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹!

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™