ViennaNETαŸ– αžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 2

αžŸαž αž‚αž˜αž“αŸαž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ Raiffeisenbank .NET αž”αž“αŸ’αžαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαŸ’αž›αžΉαž˜αžŸαžΆαžšαžšαž”αžŸαŸ‹ ViennaNET αžŠαŸ„αž™αžŸαž„αŸ’αžαŸαž”αŸ” αž’αŸ†αž–αžΈαžšαž”αŸ€αž” αž“αž·αž„αž˜αžΌαž›αž αŸαžαž»αžŠαŸ‚αž›αž™αžΎαž„αž˜αž€αž“αŸαŸ‡ αž’αŸ’αž“αž€αž’αžΆαž…αž’αžΆαž“αž•αŸ’αž“αŸ‚αž€αžŠαŸ†αž”αžΌαž„.

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŠαŸ‚αž›αž˜αž·αž“αž‘αžΆαž“αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž…αžΆαžšαžŽαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™ αž‡αž½αžš αž“αž·αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αžŠαŸ‚αž›αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„ GitHub αžšαž”αžŸαŸ‹αž™αžΎαž„ (αž”αŸ’αžšαž—αž–αž‚αžΊαž“αŸ…αž‘αžΈαž“αŸαŸ‡) αž“αž·αž„ αž€αž‰αŸ’αž…αž”αŸ‹ Nuget αž“αŸ…αž‘αžΈαž“αŸαŸ‡.

ViennaNETαŸ– αžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 2

ViennaNET.Sagas

αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž‚αž˜αŸ’αžšαŸ„αž„αž”αŸ’αžαžΌαžšαž‘αŸ… DDD αž“αž·αž„αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αž˜αžΈαž€αŸ’αžšαžΌαžŸαŸαžœαžΆ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžαž€αŸ’αž€αžœαž·αž‡αŸ’αž‡αžΆαž’αžΆαž‡αžΈαžœαž€αž˜αŸ’αž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αŸ‚αž€αž…αžΆαž™αž“αŸ…αž‘αžΌαž‘αžΆαŸ†αž„αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž•αŸ’αžŸαŸαž„αŸ— αž”αž‰αŸ’αž αžΆαž€αžΎαžαž‘αžΎαž„αž‘αžΆαž€αŸ‹αž‘αž„αž“αžΉαž„αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž™αž“αŸ’αžαž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™ αž–αžΈαž–αŸ’αžšαŸ„αŸ‡αžŸαŸαžŽαžΆαžšαžΈαž™αŸ‰αžΌαž‡αžΆαž…αŸ’αžšαžΎαž“αž‡αžΆαžšαžΏαž™αŸ—αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αžŠαž›αŸ‹αžŠαŸ‚αž“αž‡αžΆαž…αŸ’αžšαžΎαž“αž€αŸ’αž“αž»αž„αž–αŸαž›αžαŸ‚αž˜αž½αž™αŸ” αž’αŸ’αž“αž€αž’αžΆαž…αžŸαŸ’αž‚αžΆαž›αŸ‹αž™αž“αŸ’αžαž€αžΆαžšαž”αŸ‚αž”αž“αŸαŸ‡αž±αŸ’αž™αž”αžΆαž“αž›αž˜αŸ’αž’αž·αžαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αž αž§αž‘αžΆαž αžšαžŽαŸαŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ€αžœαž—αŸ… "Microservices Patterns" Chris Richardson.

αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž™αžΎαž„ αž™αžΎαž„αž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž™αž“αŸ’αžαž€αžΆαžšαžŠαŸαžŸαžΆαž˜αž‰αŸ’αž‰αž˜αž½αž™ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαŸ– αžšαžΏαž„αž–αŸ’αžšαŸαž„αž“αž·αž‘αžΆαž“ αž¬αž‡αžΆαž”αž·αžŸαžΆαž…αž•αŸ’αž’αŸ‚αž€αž›αžΎαžœαž„αŸ‹αž—αŸ’αž›αŸαž„αŸ” αžαŸ’αž›αžΉαž˜αžŸαžΆαžšαžšαž”αžŸαŸ‹αžœαžΆαž˜αžΆαž“αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ– αž˜αžΆαž“αžŸαŸαžŽαžΆαžšαžΈαž™αŸ‰αžΌαž’αžΆαž‡αžΈαžœαž€αž˜αŸ’αž˜αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™ αžŠαŸ‚αž›αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαž’αž“αž»αžœαžαŸ’αžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž•αŸ’αžŸαŸαž„αŸ— αž αžΎαž™αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž”αž‰αŸ’αž αžΆαžŽαžΆαž˜αž½αž™αž€αžΎαžαž‘αžΎαž„αž€αŸ’αž“αž»αž„αž‡αŸ†αž αžΆαž“αžŽαžΆαž˜αž½αž™ αž“αŸ„αŸ‡αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαž αŸ…αž‘αŸ…αž“αžΈαžαž·αžœαž·αž’αžΈ rollback αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‡αŸ†αž αžΆαž“αž˜αž»αž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αžŠαŸ‚αž›αž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αžœαžΆαž˜αžΆαž“αŸ” αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž αžΎαž™ αž“αŸ…αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαžšαžΏαž„αž“αž·αž‘αžΆαž“ αžŠαŸ„αž™αž˜αž·αž“αž‚αž·αžαž–αžΈαž—αžΆαž–αž‡αŸ„αž‚αž‡αŸαž™ αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αžšαž”αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ‚αž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”

αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžšαž”αžŸαŸ‹αž™αžΎαž„αž“αŸ…αžαŸ‚αž’αŸ’αžœαžΎαž‘αžΎαž„αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžšαž”αžŸαŸ‹αžœαžΆ αž αžΎαž™αž˜αž·αž“αž‡αžΆαž”αŸ‹αž‘αžΆαž€αŸ‹αž‘αž„αž“αžΉαž„αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžŽαžΆαž˜αž½αž™αž“αŸƒαž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž‡αžΆαž˜αž½αž™αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αžœαžΆαž˜αž·αž“αž–αž·αž”αžΆαž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž‘αŸαŸ– αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž”αž„αŸ’αž€αžΎαžαž‡αžΆαž€αžΌαž“αž…αŸ…αž“αŸƒαžαŸ’αž“αžΆαž€αŸ‹αž’αžšαžΌαž”αžΈαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ 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 αž‚αžΊαž‡αžΆαž…αŸ†αžŽαž»αž…αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸαžŸαŸ†αžαžΆαž“αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž’αž„αŸ’αž‚αž—αžΆαž–αž€αžΆαžšαž„αžΆαžš αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž’αž„αŸ’αž‚αž—αžΆαž–αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹ αž€αŸαžŠαžΌαž…αž‡αžΆαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαž“αŸƒαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ αž“αž·αž„αžŸαŸ†αžŽαž½αžš 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": "..."
  }
],

αž§αž‘αžΆαž αžšαžŽαŸαž”αžšαž·αž”αž‘αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ–

internal sealed class DbContext : ApplicationContext
{
  public DbContext()
  {
    AddEntity<SomeEntity>("mssql_connection");
    AddEntity<MigratedSomeEntity>("oracle_connection");
    AddEntity<AnotherEntity>("oracle_connection");
  }
}

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹ αž“αŸ„αŸ‡αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αžˆαŸ’αž˜αŸ„αŸ‡ "αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜" αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαŸ”

αž€αžΆαžšαž‚αžΌαžŸαž•αŸ‚αž“αž‘αžΈαžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž“αŸƒαž’αž„αŸ’αž‚αž—αžΆαž–αž‘αŸ…αž“αžΉαž„αžαžΆαžšαžΆαž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž”αž€αžšαžŽαŸ NHibernate αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎαž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž‘αžΆαŸ†αž„αžαžΆαž˜αžšαž™αŸˆαž―αž€αžŸαžΆαžš xml αž“αž·αž„αžαžΆαž˜αžšαž™αŸˆαžαŸ’αž“αžΆαž€αŸ‹αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŸαžšαžŸαŸαžšαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž“αŸƒαžƒαŸ’αž›αžΆαŸ†αž„αžŠαžΎαž˜αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž―αž€αžαžΆ αž˜αžΆαž“αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž˜αž½αž™αŸ” 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();

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž αžΎαž™αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž αŸ…αž±αŸ’αž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŸαŸ’αžαžΆαž”αŸ‹ αžŸαžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž–αžΈαž‡αž½αžšαžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž“αžΉαž„αž‘αŸ…αž€αžΆαž“αŸ‹ processor αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αžŸαžΆαžšαžαŸ‚αž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αžšαŸ„αž„αž…αž€αŸ’αžš 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 αž•αž„αžŠαŸ‚αžšαŸ– αž™αžΎαž„αž•αŸ’αž‰αžΎαžŸαžΆαžšαž αžΎαž™αžšαž„αŸ‹αž…αžΆαŸ†αž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž–αžΈαž‡αž½αžšαž”αžŽαŸ’αžαŸ„αŸ‡αž’αžΆαžŸαž“αŸ’αž“αž–αž·αžŸαŸαžŸ αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αžαŸ‚αž˜αž½αž™αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ”

αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαž”αŸ’αžšαžΎαž‡αž½αžšαž‡αžΆαž˜αž½αž™ nuances αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“.

ViennaNET.CallContext

αž™αžΎαž„αž”αŸ’αžšαžΎαž‡αž½αžšαž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ‚αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αŸ’αžœαžΎαžŸαž˜αžΆαž αžšαžŽαž€αž˜αŸ’αž˜αžšαžœαžΆαž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž•αŸ’αžŸαŸαž„αŸ—αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ‚αž˜αž‘αžΆαŸ†αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αžšαžœαžΆαž„αž˜αžΈαž€αŸ’αžšαžΌαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαžΌαž…αž‚αŸ’αž“αžΆ αž§αž‘αžΆαž αžšαžŽαŸαž€αŸ’αž“αž»αž„αžšαžΏαž„αžαŸ’αž˜αŸ„αž…αŸ” αž“αŸαŸ‡αž”αžΆαž“αž“αžΆαŸ†αž±αŸ’αž™αž˜αžΆαž“αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αžšαž½αž˜αž‡αžΆαž˜αž½αž™αžŸαžΆαžšαžŠαžΌαž…αž‡αžΆαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αŸ†αž“αž½αž™αžŠαžΌαž…αž‡αžΆαž€αžΆαžšαž…αžΌαž›αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎ αžŸαŸ†αžŽαžΎαžšαž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αžΌαž›αž–αžΈαž…αž»αž„αžŠαž›αŸ‹αž…αž»αž„ αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP αž”αŸ’αžšαž—αž– αž“αž·αž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸαŸ‡ αž™αžΎαž„αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž˜αž½αž™αŸ” ViennaNET.CallContextαžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαžŸαŸ†αžŽαžΎαžŠαŸ‚αž›αž…αžΌαž›αž€αŸ’αž“αž»αž„αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ αžšαž”αŸ€αž”αžŠαŸ‚αž›αžŸαŸ†αžŽαžΎαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž‘αžΎαž„αžαžΆαž˜αžšαž™αŸˆαž‡αž½αžš αž¬αžαžΆαž˜αžšαž™αŸˆ Http αž˜αž·αž“αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž“αŸ„αŸ‡αž‘αŸαŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž˜αž»αž“αž–αŸαž›αž•αŸ’αž‰αžΎαžŸαŸ†αžŽαžΎ αž¬αžŸαžΆαžšαž…αŸαž‰ αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž™αž€αž…αŸαž‰αž–αžΈαž”αžšαž·αž”αž‘ αž αžΎαž™αžŠαžΆαž€αŸ‹αž€αŸ’αž“αž»αž„αž”αž‹αž˜αž€αžαžΆαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž‘αž‘αž½αž›αž”αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αŸ†αž“αž½αž™ αž“αž·αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžœαžΆαžαžΆαž˜αžšαž”αŸ€αž”αžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ”

αžŸαžΌαž˜αž’αžšαž‚αž»αžŽαž…αŸ†αž–αŸ„αŸ‡αž€αžΆαžšαž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž™αžΎαž„αž‘αž“αŸ’αž‘αžΉαž„αžšαž„αŸ‹αž…αžΆαŸ†αž˜αžαž·αž™αŸ„αž”αž›αŸ‹αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž“αž·αž„αž‘αžΆαž‰αžŸαŸ†αžŽαžΎ!

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹