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

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

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

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

ViennaNET.Sagas

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

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

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди