ViennaNET: рдмреНрдпрд╛рдХрдПрдиреНрдбрдХреЛ рд▓рд╛рдЧрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВрдХреЛ рд╕реЗрдЯред рднрд╛рдЧ 2

Raiffeisenbank рдХреЛ .NET рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рд╕рдореБрджрд╛рдпрд▓реЗ ViennaNET рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рд┐рдВрд╣рд╛рд╡рд▓реЛрдХрди рдЬрд╛рд░реА рд░рд╛рдЦреНрдЫред рд╣рд╛рдореА рдХрд╕рд░реА рд░ рдХрд┐рди рдпреЛ рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛ рдкреБрдЧреНрдпреМрдВ рдЬрд╛рдиреНрдиреБрд╣реЛрд╕реНред рддрдкрд╛рдИрдВрд▓реЗ рдпрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рдкрд╣рд┐рд▓реЛ рднрд╛рдЧрдорд╛ рдкрдвреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ.

рдпрд╕ рд▓реЗрдЦрдорд╛, рд╣рд╛рдореА рд╡рд┐рддрд░рд┐рдд рд▓реЗрдирджреЗрди, рдХреНрдпреБ, рд░ рдбрд╛рдЯрд╛рдмреЗрд╕рд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдХреЗрд╣реА рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдЫрд▓рдлрд▓ рдЧрд░реНрдиреЗрдЫреМрдВ рдЬреБрди рдЕрд╣рд┐рд▓реЗрд╕рдореНрдо рд╕рдореЗрдЯрд┐рдПрдХреЛ рдЫреИрди, рд░ рдЬреБрди рд╣рд╛рдореНрд░реЛ GitHub рднрдгреНрдбрд╛рд░рдорд╛ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫ (рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдБ рдЫред), рд░ рдиреБрдЧреЗрдЯ рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ рдпрд╣рд╛рдБ рдЫрдиреН.

ViennaNET: рдмреНрдпрд╛рдХрдПрдиреНрдбрдХреЛ рд▓рд╛рдЧрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВрдХреЛ рд╕реЗрдЯред рднрд╛рдЧ 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);

рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд╛ рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рд╣реЗрд░реНрди рд╕рдХрд┐рдиреНрдЫ рдпрд╣рд╛рдБ рд░ рд╕рднрд╛рдорд╛ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ.

рднрд┐рдпрдирд╛рдиреЗрдЯ.рдУрд░реНрдо.*

Nhibernate рдорд╛рд░реНрдлрдд рд╡рд┐рднрд┐рдиреНрди рдбрд╛рдЯрд╛рдмреЗрд╕рд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВрдХреЛ рд╕реЗрдЯред рд╣рд╛рдореА Liquibase рд╕рдБрдЧ DB-First рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ, рддреНрдпрд╕реИрд▓реЗ рдпреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдпрдорд╛ рдЕрд╡рд╕реНрдерд┐рдд рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рдбреЗрдЯрд╛рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдорд╛рддреНрд░ рд╕рдорд╛рд╡реЗрд╢ рдЫред

ViennaNET.Orm.Seedwork ╨╕ ViennaNET.Orm тАУ рдХреНрд░рдорд╢рдГ рдЖрдзрд╛рд░ рдЗрдиреНрдЯрд░рдлреЗрд╕рд╣рд░реВ рд░ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрдиреЗ рдореБрдЦреНрдп рдПрд╕реЗрдореНрдмрд▓реАрд╣рд░реВред рддрд┐рдиреАрд╣рд░реВрдХреЛ рд╕рд╛рдордЧреНрд░реАрд▓рд╛рдИ рдердк рд╡рд┐рд╡рд░рдгрдорд╛ рдЬрд╛рдБрдЪ рдЧрд░реМрдВред

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

рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рд╕рд┐рдзреИ рдкрд╣реБрдБрдЪ рдЧрд░реНрди, рд╣рд╛рдореА рдкреНрд░рджрд╛рдпрдХ рд╕рдВрдпрдиреНрддреНрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВред рд╣рд╛рдореАрд▓реЗ рд╣рд╛рдореНрд░реЛ рдЯреЛрд▓реАрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдкреНрд░рддреНрдпреЗрдХ DBMS рдХреЛ рдЖрдлреНрдиреИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реБрдиреНрдЫ: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

рдПрдЙрдЯреИ рдПрдкреНрд▓рд┐рдХреЗрд╕рдирдорд╛ рдзреЗрд░реИ рдкреНрд░рджрд╛рдпрдХрд╣рд░реВ рдПрдХреИрд╕рд╛рде рджрд░реНрддрд╛ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдХреБрдиреИ рдкрдирд┐ рдкреВрд░реНрд╡рд╛рдзрд╛рд░ рдкрд░рд┐рдорд╛рд░реНрдЬрди рдмрд┐рдирд╛ рдПрдЙрдЯреИ рд╕реЗрд╡рд╛ рднрд┐рддреНрд░ рдПрдХ DBMS рдмрд╛рдЯ рдЕрд░реНрдХреЛрдорд╛ рдЪрд░рдг-рджрд░-рдЪрд░рдг рдорд╛рдЗрдЧреНрд░реЗрд╕рди рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рдЖрд╡рд╢реНрдпрдХ рдЬрдбрд╛рди рдЪрдпрди рдЧрд░реНрдиреЗ рд╕рдВрдпрдиреНрддреНрд░ рд░ рдлрд▓рд╕реНрд╡рд░реВрдк, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдХрд╛рдИ рд╡рд░реНрдЧ (рдЬрд╕рдХреЛ рд▓рд╛рдЧрд┐ DB рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВрдорд╛ рдореНрдпрд╛рдкрд┐рдЩ рд▓реЗрдЦрд┐рдПрдХреЛ рдЫ) рдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рджрд╛рдпрдХрд▓рд╛рдИ 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");
  }
}

рдпрджрд┐ рдЬрдбрд╛рди ID рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫреИрди рднрдиреЗ, "рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд" рдирд╛рдордХреЛ рдЬрдбрд╛рди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреЗрдЫред

рдбрд╛рдЯрд╛рдмреЗрд╕ рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВрдорд╛ рд╕рдВрд╕реНрдерд╛рд╣рд░реВрдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореНрдпрд╛рдкрд┐рдЩ рдорд╛рдирдХ NHibernate рдЙрдкрдХрд░рдгрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдиреНрдЫред рддрдкрд╛рдИрдВ рд╡рд┐рд╡рд░рдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ XML рдлрд╛рдЗрд▓рд╣рд░реВ рд░ рдХрдХреНрд╖рд╛рд╣рд░реВ рджреБрд╡реИ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдПрдХрд╛рдЗ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВрдорд╛ рд╕реНрдЯрдм рд░рд┐рдкреЛрдЬрд┐рдЯрд░реАрд╣рд░реВ рд╕рдЬрд┐рд▓реИ рд▓реЗрдЦреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЙрдкрд▓рдмреНрдз рдЫред ViennaNET.TestUtils.Orm.

ViennaNET.Orm.* рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫред рдпрд╣рд╛рдБ.

рднрд┐рдпрдирд╛рдиреЗрдЯред рд╕рдиреНрджреЗрд╢ред*

рд▓рд╛рдорд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВрдХреЛ рд╕реЗрдЯред

рдХреНрдпреБрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╡рд┐рднрд┐рдиреНрди DBMS рд╕рдБрдЧ рдЬрд╕реНрддреИ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЫрдиреЛрдЯ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ, рдЕрд░реНрдерд╛рддреН, рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рд╕рдиреНрджрд░реНрднрдорд╛ рд╕рдмреИрднрдиреНрджрд╛ рд╕рдореНрднрд╛рд╡рд┐рдд рдПрдХреАрдХреГрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХреЛ рдХреНрдпреБ рдкреНрд░рдмрдиреНрдзрдХрдХреЛ рдкрд░реНрд╡рд╛рд╣ рдирдЧрд░реАред рдкреБрд╕реНрддрдХрд╛рд▓рдп ViennaNET.Messaging рдпреЛ рдПрдХреАрдХрд░рдгрдХреЛ рд▓рд╛рдЧрд┐ рдареНрдпрд╛рдХреНрдХреИ рдЬрд┐рдореНрдореЗрд╡рд╛рд░ рдЫ, рд░ ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue ╨╕ ViennaNET.Messaging.KafkaQueue рдХреНрд░рдорд╢рдГ IBM MQ, RabbitMQ рд░ Kafka рдХрд╛ рд▓рд╛рдЧрд┐ рдПрдбреЗрдкреНрдЯрд░рд╣рд░реВрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред

рд▓рд╛рдЗрдирд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рджреБрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рдЫрдиреН: рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рд░ рдкрдард╛рдЙрдиреЗред

рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рдмрд╛рд░реЗрдорд╛ рд╡рд┐рдЪрд╛рд░ рдЧрд░реМрдВред рдпрд╣рд╛рдБ рджреБрдИ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдЫрдиреН: рдирд┐рд░рдиреНрддрд░ рд╕реБрдиреНрдирдХреЛ рд▓рд╛рдЧрд┐ рд░ рдПрдХрд▓ рд╕рдиреНрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ред рд▓рдЧрд╛рддрд╛рд░ рдХреНрдпреБ рд╕реБрдиреНрдирдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ рдкрд╣рд┐рд▓реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реНрдиреБрдкрд░реНрдЫ рдЬреБрди рдмрд╛рдЯ рдкреНрд░рд╛рдкреНрдд рд╣реБрдиреНрдЫ IMessageProcessor, рдЬреБрди рдЖрдЧрдорди рд╕рдиреНрджреЗрд╢ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрди рдЬрд┐рдореНрдореЗрд╡рд╛рд░ рд╣реБрдиреЗрдЫред рдЕрд░реНрдХреЛ, рдпреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрдпреБрдорд╛ "рд▓рд┐рдЩреНрдХ" рд╣реБрдиреБрдкрд░реНрдЫ, рдЬреБрди рджрд░реНрддрд╛ рдЧрд░реЗрд░ рдЧрд░рд┐рдиреНрдЫред IQueueReactorFactory рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдмрд╛рдЯ рдХреНрдпреБ ID рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрджреИ:

"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, рдЬрд╕рд▓реЗ рдЖрдЧрдорди рдЕрдиреБрд░реЛрдзрдмрд╛рдЯ рд╕реЗрд╡рд╛рдорд╛ рдбреЗрдЯрд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рдЕрдиреБрд░реЛрдз рдХреНрдпреБ рдорд╛рд░реНрдлрдд рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ рд╡рд╛ Http рдорд╛рд░реНрдлрдд рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ рднрдиреНрдиреЗ рдХреБрд░рд╛ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЫред рддреНрдпрд╕рдкрдЫрд┐, рдмрд╣рд┐рд░реНрдЧрдорди рдЕрдиреБрд░реЛрдз рд╡рд╛ рд╕рдиреНрджреЗрд╢ рдкрдард╛рдЙрдиреБ рдЕрдШрд┐, рдбреЗрдЯрд╛ рд╕рдиреНрджрд░реНрднрдмрд╛рдЯ рдирд┐рдХрд╛рд▓рд┐рдиреНрдЫ рд░ рд╣реЗрдбрд░рд╣рд░реВрдорд╛ рд░рд╛рдЦрд┐рдиреНрдЫред рдпрд╕ рддрд░рд┐рдХрд╛рд▓реЗ, рдЕрд░реНрдХреЛ рд╕реЗрд╡рд╛рд▓реЗ рд╕рд╣рд╛рдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрджрдЫ рд░ рддреНрдпрд╕реИрдЧрд░реА рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдЧрд░реНрджрдЫред

рддрдкрд╛рдИрдВрдХреЛ рдзреНрдпрд╛рдирдХреЛ рд▓рд╛рдЧрд┐ рдзрдиреНрдпрд╡рд╛рдж, рд╣рд╛рдореА рддрдкрд╛рдИрдВрдХреЛ рдЯрд┐рдкреНрдкрдгреА рд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рддрддреНрдкрд░ рдЫреМрдВ!

рд╕реНрд░реЛрдд: www.habr.com