ViennaNET: otu ọba akwụkwọ maka azụ azụ. Akụkụ 2

Ndị mmepe Raiffeisenbank .NET na-aga n'ihu na-enyocha ọdịnaya ViennaNET nkenke. Banyere otu na ihe kpatara anyị ji bịa na nke a, ị nwere ike ịgụ akụkụ nke mbụ.

N'isiokwu a, anyị ga-agafe ọba akwụkwọ ndị a na-echebabeghị maka ịrụ ọrụ na azụmahịa ekesara, kwụ n'ahịrị na ọdụ data, nke enwere ike ịchọta na ebe nchekwa GitHub anyị (isi mmalite dị ebe a), na Ngwunye Nuget ebe a.

ViennaNET: otu ọba akwụkwọ maka azụ azụ. Akụkụ 2

ViennaNET.Sagas

Mgbe oru ngo na-agbanwe na DDD na microservice architecture, mgbe ahụ, mgbe a na-ekesa echiche azụmahịa n'ofe ọrụ dị iche iche, nsogbu na-ebilite na mkpa ọ dị iji mejuputa usoro azụmahịa nkesa, n'ihi na ọtụtụ ọnọdụ na-emetụta ọtụtụ ngalaba n'otu oge. Ị nwere ike ịmatakwu usoro ndị dị otú ahụ n'ụzọ zuru ezu, dịka ọmụmaatụ, n'akwụkwọ "Microservices Patterns", Chris Richardson.

N'ime ọrụ anyị, anyị etinyela usoro dị mfe mana bara uru: saga, ma ọ bụ karịa saga dabere na orchestration. Ihe kachasị mkpa ya bụ nke a: enwere ụfọdụ ọnọdụ azụmahịa nke ọ dị mkpa iji rụọ ọrụ n'usoro n'usoro na ọrụ dị iche iche, ma ọ bụrụ na nsogbu ọ bụla na-ebilite n'ọnọdụ ọ bụla, ọ dị mkpa ịkpọ usoro ntụgharị maka usoro niile gara aga, ebe ọ dị. enyere. Ya mere, na njedebe nke saga, n'agbanyeghị ihe ịga nke ọma, anyị na-enweta data na-agbanwe agbanwe na ngalaba niile.

A ka na-eme mmejuputa iwu anyị n'ụdị ya bụ isi ma ejikọtaghị ya na iji usoro ọ bụla nke mmekọrịta na ọrụ ndị ọzọ. Ọ bụghị ihe siri ike iji: naanị mee ka nwa nke isi ihe na-adịghị ahụkebe na klas SagaBase <T>, ebe T bụ ihe gbasara ọnọdụ gị nke ị nwere ike ịchekwa data mbụ dị mkpa maka saga na-arụ ọrụ, yana ụfọdụ nsonaazụ etiti. A ga-agafe ihe atụ gbara ya gburugburu na usoro niile n'oge mmebe. Saga n'onwe ya bụ klaasị enweghị steeti, yabụ enwere ike itinye ihe atụ na DI dị ka Singleton iji nweta ihe ndabere dị mkpa.

Mgbasa ozi ọmụmaatụ:

public class ExampleSaga : SagaBase<ExampleContext>
{
  public ExampleSaga()
  {
    Step("Step 1")
      .WithAction(c => ...)
      .WithCompensation(c => ...);
	
    AsyncStep("Step 2")
      .WithAction(async c => ...);
  }
}

Ọmụmaatụ oku:

var saga = new ExampleSaga();
var context = new ExampleContext();
await saga.Execute(context);

Enwere ike ilele ihe atụ zuru oke nke mmejuputa iwu dị iche iche ebe a na na mgbakọ na ule.

ViennaNET.Orm.*

Otu ọba akwụkwọ maka ịrụ ọrụ na ọdụ data dị iche iche site na Nhibernate. Anyị na-eji ụzọ DB-First na-eji Liquibase, yabụ enwere naanị ọrụ maka iji data rụọ ọrụ na nchekwa data emebere.

ViennaNET.Orm.Seedwork и ViennaNET.Orm - nnukwu ọgbakọ nwere oghere ndị bụ isi na mmejuputa ha, n'otu n'otu. Ka anyị leba anya n'ihe dị n'ime ha nke ọma.

interface IEntityFactoryService na mmejuputa ya EntityFactoryService bụ isi mmalite maka ịrụ ọrụ na nchekwa data, ebe ọ bụ na Unit of Work, ebe nchekwa maka ịrụ ọrụ na ụlọ ọrụ dị iche iche, yana ndị na-emezu iwu na ajụjụ SQL kpọmkwem ka emepụtara ebe a. Mgbe ụfọdụ, ọ na-adabara ịmachi ikike nke klaasị maka ịrụ ọrụ na nchekwa data, dịka ọmụmaatụ, inye ikike ịgụ naanị data. Maka ikpe ndị dị otú ahụ IEntityFactoryService e nwere onye nna ochie - interface IEntityRepositoryFactory, nke na-ekwupụta naanị usoro maka ịmepụta ebe nchekwa.

Iji nweta nchekwa data ozugbo, a na-eji usoro onye na-eweta ya. DBMS ọ bụla anyị na-eji na otu anyị nwere mmejuputa ya: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

N'otu oge ahụ, ọtụtụ ndị na-enye ọrụ nwere ike ịdenye aha n'otu ngwa n'otu oge, nke na-enye ohere, dịka ọmụmaatụ, n'ime usoro nke otu ọrụ, na-enweghị ụgwọ ọ bụla maka ịmegharị akụrụngwa, iji mee njem site na nzọụkwụ site na nzọụkwụ. otu DBMS gaa na nke ọzọ. Usoro maka ịhọrọ njikọ achọrọ yana, ya mere, onye na-enye klaasị kpọmkwem (nke edere maapụ na tebụl nchekwa data) na-emejuputa ya site na ịdenye aha na ngalaba BoundedContext (nwere usoro maka ịdenye aha ngalaba ngalaba) ma ọ bụ onye ga-anọchi ya. NgwaContext (nwere ụzọ maka ịdenye aha ngwa, arịrịọ ozugbo na iwu), ebe a na-anabata njirimara njikọ sitere na nhazi dị ka arụmụka:

"db": [
  {
    "nick": "mssql_connection",
    "dbServerType": "MSSQL",
    "ConnectionString": "...",
    "useCallContext": true
  },
  {
    "nick": "oracle_connection",
    "dbServerType": "Oracle",
    "ConnectionString": "..."
  }
],

Ọmụmaatụ NgwaContext:

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

Ọ bụrụ na akọwapụtaghị NJ njikọ ahụ, a ga-eji njikọ akpọrọ "ndabara" ga-eji.

A na-eji ngwaọrụ NHibernate ọkọlọtọ emejuputa mawapụta ihe ozugbo na tebụl nchekwa data. Ị nwere ike iji nkọwa ahụ ma site na faịlụ xml yana site na klaasị. Maka ide ebe nchekwa stub dị mma na ule Unit, enwere ọbá akwụkwọ ViennaNET.TestUtils.Orm.

Enwere ike ịchọta ọmụmaatụ zuru oke nke iji ViennaNET.Orm.* ebe a.

Ozi ViennaNET.*

Otu ọba akwụkwọ maka iji kwụ n'ahịrị na-arụ ọrụ.

Iji kwụ n'ahịrị na-arụ ọrụ, a họọrọ otu ụzọ ahụ dị ka ọ dị na DBMS dị iche iche, ya bụ, usoro ịdị n'otu kachasị nke enwere ike ime n'ihe gbasara ịrụ ọrụ na ọba akwụkwọ, n'agbanyeghị onye njikwa kwụ n'ahịrị ejiri. Ụlọ akwụkwọ ViennaNET.Messaging bụ kpọmkwem maka ịdị n'otu a, na ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue и ViennaNET.Messaging.KafkaQueue nwere mmejuputa ihe nkwụnye maka IBM MQ, RabbitMQ na Kafka, n'otu n'otu.

Mgbe ị na-arụ ọrụ na kwụ n'ahịrị, enwere usoro abụọ: ịnata ozi na izipu ya.

Tụlee ịnata. Enwere nhọrọ abụọ ebe a: maka ịge ntị na-aga n'ihu na ịnata otu ozi. Iji gee kwụ n'ahịrị mgbe niile, ị ga-ebu ụzọ kọwaa klaasị processor ketara IMessageProcessor, nke ga-abụ ọrụ maka ịhazi ozi na-abata. Na-esote, a ga-ejikọta ya na otu kwụ n'ahịrị; a na-eme nke a site na ndebanye aha IQueueReactorFactory na-egosi njirimara kwụ n'ahịrị site na nhazi ahụ:

"messaging": {
    "ApplicationName": "MyApplication"
},
"rabbitmq": {
    "queues": [
      {
        "id": "myQueue",
        "queuename": "lalala",
        ...
      }
    ]
},

Ọmụmaatụ nke ịmalite ige ntị:

_queueReactorFactory.Register<MyMessageProcessor>("myQueue");
var queueReactor = queueReactorFactory.CreateQueueReactor("myQueue");
queueReactor.StartProcessing();

Mgbe ahụ, mgbe ọrụ ahụ malitere ma kpọọ usoro ka ịmalite ige ntị, ozi niile sitere na kwụ n'ahịrị a kapịrị ọnụ ga-aga na nhazi nhazi.

Iji nweta otu ozi na interface ụlọ ọrụ IMessagingComponentFactory enwere usoro CreateMessageReceivernke ga-eme ka onye nnata chere ozi sitere na kwụ n'ahịrị akọwapụtara ya:

using (var receiver = _messagingComponentFactory.CreateMessageReceiver<TestMessage>("myQueue"))
{
    var message = receiver.Receive();
}

Iji zipu ozi ịkwesịrị iji otu ihe ahụ IMessagingComponentFactory ma mepụta onye na-ezipụ ozi:

using (var sender = _messagingComponentFactory.CreateMessageSender<MyMessage>("myQueue"))
{
    sender.SendMessage(new MyMessage { Value = ...});
}

Enwere nhọrọ atọ emebere maka ịdekọ na ịkọwapụta ozi: naanị ederede, XML na JSON, mana ọ bụrụ na ọ dị mkpa, ịnwere ike ịme mmemme interface nke gị ngwa ngwa. IMessageSerializer и IMessageDeserializer.

Anyị gbalịrị ichekwa ike pụrụ iche nke onye njikwa kwụ n'ahịrị ọ bụla, dịka. ViennaNET.Messaging.MQSeriesQueue na-enye gị ohere izipu ọ bụghị naanị ederede, kamakwa ozi byte, na ViennaNET.Messaging.RabbitMQQueue na-akwado ịkwọgharị na ịkwọ ụgbọ elu. Ihe mkpuchi ihe nkwụnye anyị maka RabbitMQ na-arụkwa ọrụ ụfọdụ nke RPC: anyị na-eziga ozi ma chere maka nzaghachi site na kwụ n'ahịrị nwa oge pụrụ iche, nke emepụtara naanị maka ozi nzaghachi.

ebe a ọmụmaatụ nke iji kwụ n'ahịrị nwere nuances njikọ bụ isi.

ViennaNET.CallContext

Anyị na-eji kwụ n'ahịrị ọ bụghị naanị maka njikọta n'etiti sistemu dị iche iche, kamakwa maka nkwukọrịta n'etiti microservices nke otu ngwa, dịka ọmụmaatụ, n'ime saga. Nke a mere ka ọ dị mkpa ịnyefe yana ozi dị ka data inyeaka dị ka nbanye onye ọrụ, ihe nchọpụta arịrịọ maka ntinye njedebe na njedebe, adreesị IP isi na data ikike. Iji mejuputa nnyefe nke data a, anyị mepụtara ọbá akwụkwọ ViennaNET.CallContext, nke na-enye gị ohere ịchekwa data sitere na arịrịọ ịbanye ọrụ. N'okwu a, ka esi rịọ arịrịọ, site na kwụ n'ahịrị ma ọ bụ site na Http, adịghị mkpa. Mgbe ahụ, tupu izipu arịrịọ ma ọ bụ ozi na-apụ apụ, a na-ewepụta data site na gburugburu ma tinye ya na nkụnye eji isi mee. Ya mere, ọrụ na-esote na-enweta data enyemaka ma na-ejikwa ya n'otu ụzọ ahụ.

Daalụ maka nlebara anya gị, anyị na-atụ anya okwu gị ma dọpụta arịrịọ!

isi: www.habr.com

Tinye a comment