ViennaNET: ืึท ืกื›ื•ื ืคื•ืŸ ืœื™ื™ื‘ืจืขืจื™ื– ืคึฟืึทืจ ื“ื™ ื‘ืึทืงืขื ื“. ื˜ื™ื™ืœ 2

ื“ื™ Raiffeisenbank .NET ื“ืขื•ื•ืขืœืึธืคึผืขืจ ืงื”ืœ ื”ืืœื˜ ืฆื• ื‘ืขืงื™ืฆืขืจ ืึธืคึผืฉืึทืฆืŸ ื“ื™ ืื™ื ื”ืึทืœื˜ ืคื•ืŸ ViennaNET. ื•ื•ืขื’ืŸ ื•ื•ื™ ืื•ืŸ ื•ื•ืึธืก ืžื™ืจ ื’ืขืงื•ืžืขืŸ ืฆื• ื“ืขื, ืื™ืจ ืงืขื ืขืŸ ืœื™ื™ืขื ืขืŸ ื“ื™ ืขืจืฉื˜ืขืจ ื˜ื™ื™ืœ.

ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ, ืžื™ืจ ื•ื•ืขืœืŸ ื“ื•ืจื›ื’ื™ื™ืŸ ื ืึธืš-ืฆื•-ื–ื™ื™ืŸ-ื‘ืื˜ืจืื›ื˜ ืœื™ื™ื‘ืจืขืจื™ื– ืคึฟืึทืจ ืืจื‘ืขื˜ืŸ ืžื™ื˜ ืคื•ื ืื ื“ืขืจื’ืขื˜ื™ื™ืœื˜ ื˜ืจืึทื ื–ืึทืงืฉืึทื ื–, ืงื™ื•ื– ืื•ืŸ ื“ืึทื˜ืึทื‘ื™ื™ืกื™ื–, ื•ื•ืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืคึฟื•ื ืขืŸ ืื™ืŸ ืื•ื ื“ื–ืขืจ GitHub ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ (ืžืงื•ืจื™ื ื–ืขื ืขืŸ ื“ืึธ), ืึท ื ื•ื’ืขื˜ ืคึผืึทืงืึทื“ื–ืฉืึทื– ื“ืึธ.

ViennaNET: ืึท ืกื›ื•ื ืคื•ืŸ ืœื™ื™ื‘ืจืขืจื™ื– ืคึฟืึทืจ ื“ื™ ื‘ืึทืงืขื ื“. ื˜ื™ื™ืœ 2

ViennaNET.Sagas

ื•ื•ืขืŸ ืึท ืคึผืจื•ื™ืขืงื˜ ืกื•ื•ื™ื˜ืฉื™ื– ืฆื• DDD ืื•ืŸ ืžื™ืงืจืึธืกืขืจื•ื•ื™ืก ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจ, ื•ื•ืขืŸ ื’ืขืฉืขืคื˜ ืœืึธื’ื™ืง ืื™ื– ืคื•ื ืื ื“ืขืจื’ืขื˜ื™ื™ืœื˜ ืื™ื‘ืขืจ ืคืึทืจืฉื™ื“ืขื ืข ื‘ืึทื“ื™ื ื•ื ื’ืก, ืึท ืคึผืจืึธื‘ืœืขื ืขืจื™ื™ื–ืึทื– ืฉื™ื™ึทื›ื•ืช ืฆื• ื“ื™ ื ื•ื™ื˜ ืฆื• ื™ื ืกื˜ืจื•ืžืขื ื˜ ืึท ืคื•ื ืื ื“ืขืจื’ืขื˜ื™ื™ืœื˜ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืžืขืงืึทื ื™ื–ืึทื, ื•ื•ื™ื™ึทืœ ืคื™ืœืข ืกื™ื ืขืจื™ืึธื•ื– ืึธืคื˜ ื•ื•ื™ืจืงืŸ ืขื˜ืœืขื›ืข ื“ืึธื•ืžื™ื™ื ื– ืื™ืŸ ืึทืžืึธืœ. ืื™ืจ ืงืขื ืขืŸ ื‘ืึทืงื•ืžืขืŸ ื‘ืึทืงืึทื ื˜ ืžื™ื˜ ืึทื–ืึท ืžืขืงืึทื ื™ื–ืึทืžื– ืื™ืŸ ืžืขืจ ื“ืขื˜ืึทืœ, ืœืžืฉืœ, ืื™ืŸ ื“ืขื ื‘ื•ืš "Microservices Patterns", Chris Richardson.

ืื™ืŸ ืื•ื ื“ื–ืขืจ ืคึผืจืึทื“ื–ืฉืขืงืก, ืžื™ืจ ื”ืึธื‘ืŸ ื™ืžืคึผืœืึทืžืขื ืึทื“ ืึท ืคึผืฉื•ื˜ ืึธื‘ืขืจ ื ื•ืฆื™ืง ืžืขืงืึทื ื™ื–ืึทื: ืึท ืกืึทื’ืข, ืึธื“ืขืจ ื’ืึทื ืฅ ืึทืŸ ืึธืจืงืขืกื˜ืจืึทื˜ื™ืึธืŸ-ื‘ืื–ื™ืจื˜ ืกืึทื’ืข. ื“ื™ ืขืกืึทื ืก ืื™ื– ื•ื•ื™ ื’ื™ื™ื˜: ืขืก ืื™ื– ืึท ื–ื™ื›ืขืจ ื’ืขืฉืขืคื˜ ืกืฆืขื ืึทืจ ืื™ืŸ ื•ื•ืึธืก ืขืก ืื™ื– ื ื™ื™ื˜ื™ืง ืฆื• ืกืึทืงื•ื•ืขื ื˜ืฉืึทืœื™ ื“ื•ืจื›ืคื™ืจืŸ ืึทืคึผืขืจื™ื™ืฉืึทื ื– ืื™ืŸ ืคืึทืจืฉื™ื“ืขื ืข ื‘ืึทื“ื™ื ื•ื ื’ืก, ืื•ืŸ ืื•ื™ื‘ ืขืก ื–ืขื ืขืŸ ืงื™ื™ืŸ ืคืจืื‘ืœืขืžืขืŸ ืื™ืŸ ืงื™ื™ืŸ ืฉืจื™ื˜, ืขืก ืื™ื– ื ื™ื™ื˜ื™ืง ืฆื• ืจื•ืคืŸ ื“ื™ ืจืึธื•ืœื‘ืึทืง ืคึผืจืึธืฆืขื“ื•ืจ ืคึฟืึทืจ ืึทืœืข ื“ื™ ืคืจื™ืขืจื“ื™ืงืข ืกื˜ืขืคึผืก. ืฆื•ื’ืขืฉื˜ืขืœื˜. ืื–ื•ื™, ืื™ืŸ ื“ื™ ืกื•ืฃ ืคื•ืŸ ื“ื™ ืกืึทื’ืข, ืจืึทื’ืึทืจื“ืœืึทืก ืคื•ืŸ ื”ืฆืœื—ื”, ืžื™ืจ ื‘ืึทืงื•ืžืขืŸ ืงืึธื ืกื™ืกื˜ืขื ื˜ ื“ืึทื˜ืŸ ืื™ืŸ ืึทืœืข ื“ืึธื•ืžื™ื™ื ื–.

ืื•ื ื“ื–ืขืจ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืื™ื– ื ืึธืš ื’ืขืžืื›ื˜ ืื™ืŸ ื–ื™ื™ึทืŸ ื™ืงืขืจื“ื™ืง ืคืึธืจืขื ืื•ืŸ ืื™ื– ื ื™ืฉื˜ ื˜ื™ื™ื“ ืฆื• ื“ื™ ื ื•ืฆืŸ ืคื•ืŸ ืงื™ื™ืŸ ืžืขื˜ื”ืึธื“ืก ืคื•ืŸ ื™ื ื˜ืขืจืึทืงืฉืึทืŸ ืžื™ื˜ ืื ื“ืขืจืข ื‘ืึทื“ื™ื ื•ื ื’ืก. ืขืก ืื™ื– ื ื™ืฉื˜ ืฉื•ื•ืขืจ ืฆื• ื ื•ืฆืŸ: ื ืึธืจ ืžืึทื›ืŸ ืึท ืึธืคึผืฉื˜ืึทืžืœื™ื ื’ ืคื•ืŸ ื“ื™ ื‘ืึทื–ืข ืึทื‘ืกื˜ืจืึทืงื˜ ืงืœืึทืก SagaBase<T>, ื•ื•ื• T ืื™ื– ื“ื™ื™ืŸ ืงืึธื ื˜ืขืงืกื˜ ืงืœืึทืก ืื™ืŸ ื•ื•ืึธืก ืื™ืจ ืงืขื ืขืŸ ืงืจืึธื ื“ื™ ืขืจืฉื˜ ื“ืึทื˜ืŸ ื ื™ื™ื˜ื™ืง ืคึฟืึทืจ ื“ื™ ืกืึทื’ืข ืฆื• ืึทืจื‘ืขื˜ืŸ, ืื•ืŸ ืขื˜ืœืขื›ืข ื™ื ื˜ืขืจืžื™ื“ื™ื™ื˜ ืจืขื–ื•ืœื˜ืึทื˜ืŸ. ื“ืขืจ ืงืึธื ื˜ืขืงืกื˜ ื‘ื™ื™ึทืฉืคึผื™ืœ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื“ื•ืจื›ื’ืขื’ืื ื’ืขืŸ ื“ื•ืจืš ืึทืœืข ืกื˜ืขืคึผืก ื‘ืขืฉืึทืก ื“ื•ืจื›ืคื™ืจื•ื ื’. ืกืึทื’ืึท ื–ื™ืš ืื™ื– ืึท ืกื˜ืึทื˜ืขืœืขืกืก ืงืœืึทืก, ืึทื–ื•ื™ ื“ืขืจ ื‘ื™ื™ึทืฉืคึผื™ืœ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืฉื˜ืขืœื˜ ืื™ืŸ DI ื•ื•ื™ ืึท ืกื™ื ื’ืœืขื˜ืึธืŸ ืฆื• ื‘ืึทืงื•ืžืขืŸ ื“ื™ ื ื™ื™ื˜ื™ืง ื“ื™ืคึผืขื ื“ืึทื ืกื™ื–.

ื‘ื™ื™ึทืฉืคึผื™ืœ ืึทื“:

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 ื–ืขื ืขืŸ ื“ื™ ื”ื•ื™ืคึผื˜ ืกื˜ืึทืจื˜ื™ื ื’ ืคื•ื ื˜ ืคึฟืึทืจ ืืจื‘ืขื˜ืŸ ืžื™ื˜ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก, ื–ื™ื ื˜ ื“ื™ ืึทืคึผืึทืจืึทื˜ ืคื•ืŸ ืึทืจื‘ืขื˜, ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ื– ืคึฟืึทืจ ืืจื‘ืขื˜ืŸ ืžื™ื˜ ืกืคึผืขืฆื™ืคื™ืฉ ืขื ื˜ื™ื˜ื™ื–, ื•ื•ื™ ื’ืขื–ื•ื ื˜ ื•ื•ื™ ืขืงืกืึทืงื™ื•ื˜ืขืจื– ืคื•ืŸ ืงืึทืžืึทื ื“ื– ืื•ืŸ ื“ื™ืจืขืงื˜ ืกืงืœ ืงื•ื•ื™ืจื™ื– ื–ืขื ืขืŸ ื‘ืืฉืืคืŸ ื“ืึธ. ืžืืœ ืขืก ืื™ื– ื‘ืึทืงื•ื•ืขื ืฆื• ื‘ืึทื’ืจืขื ืขืฆืŸ ื“ื™ ืงื™ื™ืคึผืึทื‘ื™ืœืึทื˜ื™ื– ืคื•ืŸ ืึท ืงืœืึทืก ืคึฟืึทืจ ืืจื‘ืขื˜ืŸ ืžื™ื˜ ืึท ื“ืึทื˜ืึทื‘ื™ื™ืก, ืœืžืฉืœ, ืฆื• ืฆื•ืฉื˜ืขืœืŸ ื“ื™ ืคื™ื™ื™ืงื™ื™ื˜ ื‘ืœื•ื™ื– ืฆื• ืœื™ื™ืขื ืขืŸ ื“ืึทื˜ืŸ. ืคึฟืึทืจ ืึทื–ืึท ืงืึทืกืขืก IEntityFactoryService ืขืก ืื™ื– ืึทืŸ ืึธื•ื•ืขืก - ืฆื•ื‘ื™ื ื“ IEntityRepositoryFactory, ื•ื•ืึธืก ื‘ืœื•ื™ื– ื“ืขืจืงืœืขืจื˜ ืึท ืžืขื˜ืึธื“ ืคึฟืึทืจ ืงืจื™ื™ื™ื˜ื™ื ื’ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ื–.

ืฆื• ื’ืœื™ื™ืš ืึทืงืกืขืก ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก, ื“ื™ ืฉืคึผื™ื™ึทื–ืขืจ ืžืขืงืึทื ื™ื–ืึทื ืื™ื– ื’ืขื ื™ืฆื˜. ื™ืขื“ืขืจ DBMS ืžื™ืจ ื ื•ืฆืŸ ืื™ืŸ ืื•ื ื“ื–ืขืจ ื˜ื™ืžื– ื”ืื˜ ื–ื™ื™ืŸ ืื™ื™ื’ืขื ืข ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

ืื™ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืฆื™ื™ื˜, ืขื˜ืœืขื›ืข ืคึผืจืึทื•ื•ื™ื™ื“ืขืจื– ืงืขื ืขืŸ ื–ื™ื™ืŸ ืจืขื’ื™ืกื˜ืจื™ืจื˜ ืื™ืŸ ืื™ื™ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื™ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืฆื™ื™ื˜, ื•ื•ืึธืก ืึทืœืึทื•ื–, ืœืžืฉืœ, ืื™ืŸ ื“ื™ ืคืจื™ื™ืžื•ื•ืขืจืง ืคื•ืŸ ืื™ื™ืŸ ื“ื™ื ืกื˜, ืึธืŸ ืงื™ื™ืŸ ืงืึธืก ืคึฟืึทืจ ืžืึธื“ื™ืคื™ืฆื™ืจืŸ ื“ื™ ื™ื ืคืจืึทืกื˜ืจืึทืงื˜ืฉืขืจ, ืฆื• ื“ื•ืจื›ืคื™ืจืŸ ืึท ืฉืจื™ื˜-ืคึฟืึทืจ-ืฉืจื™ื˜ ืžื™ื’ืจืึทื˜ื™ืึธืŸ ืคื•ืŸ ืื™ื™ื ืขืจ DBMS ืฆื• ืื ื“ืขืจืŸ. ื“ืขืจ ืžืขืงืึทื ื™ื–ืึทื ืคึฟืึทืจ ืกืึทืœืขืงื˜ื™ื ื’ ื“ื™ ืคืืจืœืื ื’ื˜ ืคึฟืึทืจื‘ื™ื ื“ื•ื ื’ ืื•ืŸ, ื“ืขืจื™ื‘ืขืจ, ื“ืขืจ ืฉืคึผื™ื™ึทื–ืขืจ ืคึฟืึทืจ ืึท ืกืคึผืขืฆื™ืคื™ืฉ ืขื ื˜ื™ื˜ื™ ืงืœืึทืก (ืคึฟืึทืจ ื•ื•ืึธืก ืžืึทืคึผื™ื ื’ ืฆื• ื“ืึทื˜ืึทื‘ื™ื™ืก ื˜ื™ืฉืŸ ืื™ื– ื’ืขืฉืจื™ื‘ืŸ) ืื™ื– ื™ืžืคึผืœืึทืžืขื ืึทื“ ื“ื•ืจืš ืจืขื“ื–ืฉื™ืกื˜ืขืจื™ื ื’ ื“ื™ ืขื ื˜ื™ื˜ื™ ืื™ืŸ ื“ื™ BoundedContext ืงืœืึทืก (ืžื™ื˜ ืึท ืžืขื˜ืึธื“ ืคึฟืึทืจ ืจืขื“ื–ืฉื™ืกื˜ืขืจื™ื ื’ ืคืขืœื“ ืขื ื˜ื™ื˜ื™ื–) ืึธื“ืขืจ ื–ื™ื™ืŸ ืกืึทืงืกืขืกืขืจ ืึทืคึผืคึผืœื™ืงืึทื˜ื™ืึธืŸ ืงืึธื ื˜ืขืงืกื˜ (ืžื™ื˜ ืžืขื˜ื”ืึธื“ืก ืคึฟืึทืจ ืจืขื“ื–ืฉื™ืกื˜ืขืจื™ื ื’ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืขื ื˜ื™ื˜ื™ื–, ื“ื™ืจืขืงื˜ ืจื™ืงื•ื•ืขืก ืื•ืŸ ืงืึทืžืึทื ื“ื–), ื•ื•ื• ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ื“ืขื ื˜ื™ืคึฟื™ืงืึทืฆื™ืข ืื™ื– ืื ื’ืขื ื•ืžืขืŸ ื•ื•ื™ ืึทืŸ ืึทืจื’ื•ืžืขื ื˜:

"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 ืžื›ืฉื™ืจื™ื. ืื™ืจ ืงืขื ืขืŸ ื ื•ืฆืŸ ื“ื™ ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’ ื‘ื™ื™ื“ืข ื“ื•ืจืš ืงืกืžืœ ื˜ืขืงืขืก ืื•ืŸ ื“ื•ืจืš ืงืœืืกืŸ. ืขืก ืื™ื– ืึท ื‘ื™ื‘ืœื™ืึธื˜ืขืง ืคึฟืึทืจ ื‘ืึทืงื•ื•ืขื ืฉืจื™ื™ื‘ืŸ ืคื•ืŸ ืฉื˜ื•ื™ื‘ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ื– ืื™ืŸ ื™ื•ื ื™ื˜ ื˜ืขืกืฅ ViennaNET.TestUtils.Orm.

ื’ืึทื ืฅ ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื ื™ืฆืŸ ViennaNET.Orm.* ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืคึฟื•ื ืขืŸ ื“ืึธ.

ViennaNET.Messaging.*

ื ืกื›ื•ื ืคื•ืŸ ืœื™ื™ื‘ืจืขืจื™ื– ืคึฟืึทืจ ืืจื‘ืขื˜ืŸ ืžื™ื˜ ืงื™ื•ื–.

ืฆื• ืึทืจื‘ืขื˜ืŸ ืžื™ื˜ ืจื™ื™ืขืŸ, ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืฆื•ื’ืึทื ื’ ืื™ื– ืื•ื™ืกื“ืขืจื•ื•ื™ื™ืœื˜ ื•ื•ื™ ืžื™ื˜ ืคืึทืจืฉื™ื“ืŸ 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, ื•ื•ืึธืก ืึทืœืึทื•ื– ืื™ืจ ืฆื• ืงืจืึธื ื“ืึทื˜ืŸ ืคึฟื•ืŸ ืึท ื‘ืงืฉื” ื•ื•ืึธืก ืงื•ืžื˜ ืื™ืŸ ื“ื™ ื“ื™ื ืกื˜. ืื™ืŸ ื“ืขื ืคืึทืœ, ื“ื™ ื•ื•ืขื’ ื“ื™ ื‘ืขื˜ืŸ ืื™ื– ื’ืขืžืื›ื˜, ื“ื•ืจืš ืึท ืจื™ื™ ืึธื“ืขืจ ื“ื•ืจืš ื”ื˜ื˜ืคึผ, ื˜ื•ื˜ ื ื™ืฉื˜ ืขื ื™ืŸ. ื“ืขืจื ืึธืš, ืื™ื™ื“ืขืจ ืื™ืจ ืฉื™ืงืŸ ื“ื™ ืึทื•ื˜ื’ืึธื•ื™ื ื’ ื‘ืขื˜ืŸ ืึธื“ืขืจ ืึธื ื–ืึธื’, ื“ืึทื˜ืŸ ื–ืขื ืขืŸ ื’ืขื ื•ืžืขืŸ ืคื•ืŸ ื“ืขื ืงืึธื ื˜ืขืงืกื˜ ืื•ืŸ ื’ืขืฉื˜ืขืœื˜ ืื™ืŸ ื“ื™ ื›ืขื“ืขืจื–. ืื–ื•ื™, ื“ืขืจ ื•ื•ื™ื™ึทื˜ืขืจ ื“ื™ื ืกื˜ ื ืขืžื˜ ื“ื™ ืึทื’ื–ื™ืœื™ืขืจื™ ื“ืึทื˜ืŸ ืื•ืŸ ืžืึทื ื™ื“ื–ืฉื™ื– ืขืก ืื™ืŸ ื“ื™ ื–ืขืœื‘ืข ื•ื•ืขื’.

ื“ืื ืง ืื™ืจ ืคึฟืึทืจ ื“ื™ื™ืŸ ื•ืคืžืขืจืงื–ืึทืžืงื™ื™ื˜, ืžื™ืจ ืงื•ืงืŸ ืคืึธืจื•ื™ืก ืฆื• ื“ื™ื™ืŸ ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ ืื•ืŸ ืฆื™ืขืŸ ืจื™ืงื•ื•ืขืก!

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’