рд╡реНрд╣рд┐рдПрдиреНрдирд╛рдиреЗрдЯ: рдмреЕрдХрдПрдВрдбрд╕рд╛рдареА рд▓рд╛рдпрдмреНрд░рд░реАрдВрдЪрд╛ рд╕рдВрдЪ. рднрд╛рдЧ 2

Raiffeisenbank .NET рд╡рд┐рдХрд╕рдХ рд╕рдореБрджрд╛рдпрд╛рдиреЗ ViennaNET рдЪреНрдпрд╛ рд╕рд╛рдордЧреНрд░реАрдЪреЗ рдереЛрдбрдХреНрдпрд╛рдд рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рдХрд░рдгреЗ рд╕реБрд░реВ рдареЗрд╡рд▓реЗ рдЖрд╣реЗ. рдЖрдореНрд╣реА рд╣реЗ рдХрд╕реЗ рдЖрдгрд┐ рдХрд╛ рдЖрд▓реЛ рдпрд╛рдмрджреНрджрд▓, рддреБрдореНрд╣реА рдкрд╣рд┐рд▓рд╛ рднрд╛рдЧ рд╡рд╛рдЪреВ рд╢рдХрддрд╛.

рдпрд╛ рд▓реЗрдЦрд╛рдд, рдЖрдореНрд╣реА рд╡рд┐рддрд░рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░, рд░рд╛рдВрдЧрд╛ рдЖрдгрд┐ рдбреЗрдЯрд╛рдмреЗрд╕рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрджреНрдпрд╛рдк рд╡рд┐рдЪрд╛рд░рд╛рдд рдШреЗрддрд▓реЗрд▓реНрдпрд╛ рд▓рд╛рдпрдмреНрд░рд░реАрдВрдордзреВрди рдЬрд╛рдК, рдЬреЗ рдЖрдордЪреНрдпрд╛ GitHub рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗ рдЖрдврд│реВ рд╢рдХрддрд╛рдд (рд╕реНрд░реЛрдд рдпреЗрдереЗ рдЖрд╣реЗрдд), рдЖрдгрд┐ рдпреЗрдереЗ Nuget рдкреЕрдХреЗрдЬреЗрд╕.

рд╡реНрд╣рд┐рдПрдиреНрдирд╛рдиреЗрдЯ: рдмреЕрдХрдПрдВрдбрд╕рд╛рдареА рд▓рд╛рдпрдмреНрд░рд░реАрдВрдЪрд╛ рд╕рдВрдЪ. рднрд╛рдЧ 2

рд╡реНрд╣рд┐рдПрдиреНрдирд╛рдиреЗрдЯ.рд╕рд╛рдЧрд╛рд╕

рдЬреЗрд╡реНрд╣рд╛ рдПрдЦрд╛рджрд╛ рдкреНрд░рдХрд▓реНрдк DDD рдЖрдгрд┐ рдорд╛рдпрдХреНрд░реЛрд╕рд░реНрд╡реНрд╣рд┐рд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд╡рд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЛ, рддреЗрд╡реНрд╣рд╛ рдЬреЗрд╡реНрд╣рд╛ рд╡реНрдпрд╡рд╕рд╛рдп рддрд░реНрдХрд╢рд╛рд╕реНрддреНрд░ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╕реЗрд╡рд╛рдВрдордзреНрдпреЗ рд╡рд┐рддрд░реАрдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ, рддреЗрд╡реНрд╣рд╛ рд╡рд┐рддрд░рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдпрдВрддреНрд░рдгрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдЧрд░рдЬреЗрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╕реНрдпрд╛ рдЙрджреНрднрд╡рддреЗ, рдХрд╛рд░рдг рдмрд░реНтАНрдпрд╛рдЪ рдкрд░рд┐рд╕реНрдерд┐рддреА рдПрдХрд╛рдЪ рд╡реЗрд│реА рдЕрдиреЗрдХ рдбреЛрдореЗрдирд╡рд░ рдкрд░рд┐рдгрд╛рдо рдХрд░рддрд╛рдд. рдЖрдкрдг рдЕрд╢рд╛ рдпрдВрддреНрд░рдгрд╛рдВрд╢реА рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдК рд╢рдХрддрд╛, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, "рдорд╛рдпрдХреНрд░реЛрд╕рд░реНрд╡реНрд╣рд┐рд╕реЗрд╕ рдкреЕрдЯрд░реНрди" рдпрд╛ рдкреБрд╕реНрддрдХрд╛рдд, рдЦреНрд░рд┐рд╕ рд░рд┐рдЪрд░реНрдбрд╕рди.

рдЖрдордЪреНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдВрдордзреНрдпреЗ, рдЖрдореНрд╣реА рдПрдХ рд╕рд╛рдзреА рдкрдг рдЙрдкрдпреБрдХреНрдд рдпрдВрддреНрд░рдгрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓реА рдЖрд╣реЗ: рдЧрд╛рдерд╛, рдХрд┐рдВрд╡рд╛ рддреНрдпрд╛рдРрд╡рдЬреА рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрд╢рди-рдЖрдзрд╛рд░рд┐рдд рдЧрд╛рдерд╛. рддреНрдпрд╛рдЪреЗ рд╕рд╛рд░ рдЦрд╛рд▓реАрд▓рдкреНрд░рдорд╛рдгреЗ рдЖрд╣реЗ: рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╕рд╛рдп рдкрд░рд┐рд╕реНрдерд┐рддреА рдЖрд╣реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╕реЗрд╡рд╛рдВрдордзреНрдпреЗ рдЕрдиреБрдХреНрд░рдореЗ рдСрдкрд░реЗрд╢рдиреНрд╕ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЖрдгрд┐ рдХреЛрдгрддреНрдпрд╛рд╣реА рдЯрдкреНрдкреНрдпрд╛рд╡рд░ рдХреЛрдгрддреАрд╣реА рд╕рдорд╕реНрдпрд╛ рдЙрджреНрднрд╡рд▓реНрдпрд╛рд╕, рдорд╛рдЧреАрд▓ рд╕рд░реНрд╡ рдЪрд░рдгрд╛рдВрд╕рд╛рдареА рд░реЛрд▓рдмреЕрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЙрд▓ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдЬрд┐рдереЗ рддреЗ рдЖрд╣реЗ. рдкреНрд░рджрд╛рди рдХреЗрд▓реЗ. рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рдЧрд╛рдереЗрдЪреНрдпрд╛ рд╢реЗрд╡рдЯреА, рдпрд╢рд╛рдЪреА рдкрд░реНрд╡рд╛ рди рдХрд░рддрд╛, рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рд░реНрд╡ рдбреЛрдореЗрдирдордзреНрдпреЗ рд╕рд╛рддрддреНрдпрдкреВрд░реНрдг рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЛ.

рдЖрдордЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдЕрджреНрдпрд╛рдк рддреНрдпрд╛рдЪреНрдпрд╛ рдореВрд│ рд╕реНрд╡рд░реВрдкрд╛рдд рдХреЗрд▓реА рдЧреЗрд▓реА рдЖрд╣реЗ рдЖрдгрд┐ рдЗрддрд░ рд╕реЗрд╡рд╛рдВрд╕рд╣ рдкрд░рд╕реНрдкрд░рд╕рдВрд╡рд╛рджрд╛рдЪреНрдпрд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рдкрджреНрдзрддреА рд╡рд╛рдкрд░рдгреНрдпрд╛рд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдирд╛рд╣реА. рд╣реЗ рд╡рд╛рдкрд░рдгреЗ рдХрдареАрдг рдирд╛рд╣реА: рдлрдХреНрдд рдмреЗрд╕ рдЕреЕрдмрд╕реНрдЯреНрд░реЕрдХреНрдЯ рдХреНрд▓рд╛рд╕ 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 рджреНрд╡рд╛рд░реЗ рд╡рд┐рд╡рд┐рдз рдбреЗрдЯрд╛рдмреЗрд╕рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд▓рд╛рдпрдмреНрд░рд░реАрдВрдЪрд╛ рд╕рдВрдЪ. рдЖрдореНрд╣реА Liquibase рд╡рд╛рдкрд░реВрди DB-рдкреНрд░рдердо рджреГрд╖реНрдЯреАрдХреЛрди рд╡рд╛рдкрд░рддреЛ, рддреНрдпрд╛рдореБрд│реЗ рдХреЗрд╡рд│ рддрдпрд╛рд░ рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рдбреЗрдЯрд╛рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рдЪреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЖрд╣реЗ.

ViennaNET.Orm.Seedwork ╨╕ ViennaNET.Orm - рдЕрдиреБрдХреНрд░рдореЗ рдореВрд▓рднреВрдд рдЗрдВрдЯрд░рдлреЗрд╕ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдЕрд╕рд▓реЗрд▓реА рдореБрдЦреНрдп рдЕрд╕реЗрдВрдмреНрд▓реА. рдЪрд▓рд╛ рддреНрдпрд╛рдВрдЪреА рд╕рд╛рдордЧреНрд░реА рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рдкрд╛рд╣реВ рдпрд╛.

рд╕рдВрд╡рд╛рдж IEntityFactoryService рдЖрдгрд┐ рддреНрдпрд╛рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА EntityFactoryService рдбреЗрдЯрд╛рдмреЗрд╕рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдореБрдЦреНрдп рдкреНрд░рд╛рд░рдВрдн рдмрд┐рдВрджреВ рдЖрд╣реЗрдд, рдХрд╛рд░рдг рдХрд╛рд░реНрдп рдпреБрдирд┐рдЯ, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдШрдЯрдХрд╛рдВрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рднрд╛рдВрдбрд╛рд░, рддрд╕реЗрдЪ рдХрдорд╛рдВрдбрдЪреЗ рдПрдХреНрдЭрд┐рдХреНрдпреБрдЯрд░ рдЖрдгрд┐ рдереЗрдЯ SQL рдХреНрд╡реЗрд░реА рдпреЗрдереЗ рддрдпрд╛рд░ рдХреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд. рдХрдзреАрдХрдзреА рдбреЗрдЯрд╛рдмреЗрд╕рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд░реНрдЧрд╛рдЪреА рдХреНрд╖рдорддрд╛ рдорд░реНрдпрд╛рджрд┐рдд рдХрд░рдгреЗ рд╕реЛрдпреАрдЪреЗ рдЕрд╕рддреЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдХреЗрд╡рд│ рдбреЗрдЯрд╛ рд╡рд╛рдЪрдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдгреЗ. рдЕрд╢рд╛ рдкреНрд░рдХрд░рдгрд╛рдВрд╕рд╛рдареА IEntityFactoryService рдПрдХ рдкреВрд░реНрд╡рдЬ рдЖрд╣реЗ - рдЗрдВрдЯрд░рдлреЗрд╕ IEntityRepositoryFactory, рдЬреЗ рдлрдХреНрдд рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдЬ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреА рдкрджреНрдзрдд рдШреЛрд╖рд┐рдд рдХрд░рддреЗ.

рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рдереЗрдЯ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдкреНрд░рджрд╛рддрд╛ рдпрдВрддреНрд░рдгрд╛ рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддреЗ. рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ рд╕рдВрдШрд╛рдВрдордзреНрдпреЗ рд╡рд╛рдкрд░рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ DBMS рдЪреА рд╕реНрд╡рддрдГрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдЖрд╣реЗ: 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": "..."
  }
],

рдЙрджрд╛рд╣рд░рдг ApplicationContext:

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.рдореЗрд╕реЗрдЬрд┐рдВрдЧ.*

рд░рд╛рдВрдЧреЗрдд рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд▓рд╛рдпрдмреНрд░рд░реАрдЪрд╛ рд╕рдВрдЪ.

рд░рд╛рдВрдЧрд╛рдВрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рд╡рд┐рд╡рд┐рдз 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛