ViennaNET: waa qayb maktabado ah oo loogu talagalay dhabarka dambe. Qaybta 2

Bulshada horumarisa Raiffeisenbank .NET waxay sii wadaa inay si kooban dib ugu eegto waxa ku jira ViennaNET. Ku saabsan sida iyo sababta aan tan u nimid, waxaad akhrin kartaa qaybta koowaad.

Maqaalkan, waxaan ku dhex mari doonaa maktabado aan wali la tixgalin si ay ula shaqeeyaan wax kala iibsiga, safafka iyo xogta macluumaadka, kuwaas oo laga heli karo kaydka GitHub (ilaha ayaa halkan jooga), Baakadaha Nuget halkan.

ViennaNET: waa qayb maktabado ah oo loogu talagalay dhabarka dambe. Qaybta 2

ViennaNET.Sagas

Marka mashruucu u wareego DDD iyo microservice architecture, ka dibna marka macquulka ganacsiga loo qaybiyo adeegyada kala duwan, dhibaato ayaa soo baxda oo la xidhiidha baahida loo qabo in la hirgeliyo habka wax iibsiga ee la qaybiyey, sababtoo ah xaalado badan ayaa inta badan saameeya dhowr qaybood hal mar. Waxaad si faahfaahsan u baran kartaa hababkaas, tusaale ahaan, Buugga "Hababka Adeegga Micro", Chris Richardson.

Mashruucyadayada, waxaan ku hirgelinay hannaan fudud laakiin faa'iido leh: saga, ama taa beddelkeeda sheeko-ku-saleysan orchestration. Nuxurkeedu waa sida soo socota: waxaa jira xaalad ganacsi oo gaar ah oo ay lagama maarmaan tahay in si isdaba-joog ah loo fuliyo hawlaha adeegyada kala duwan, iyo haddii wax dhibaato ah ay soo baxdo tallaabo kasta, waxaa lagama maarmaan ah in la waco habka dib-u-celinta dhammaan tallaabooyinka hore, halkaas oo ay tahay la siiyay. Sidaa darteed, dhamaadka saga, iyadoon loo eegin guusha, waxaan helnaa xog joogto ah dhammaan qaybaha.

Hirgelinteena ayaa wali loo sameeyay qaabkeeda aasaasiga ah oo aan ku xidhnayn adeegsiga habab kasta oo isdhexgalka adeegyada kale. Ma adka in la isticmaalo: kaliya samee farac ka mid ah fasalka asaasiga ah ee SagaBase <T>, halkaas oo T ay tahay fasalkaaga macnaha guud kaas oo aad ku kaydin karto xogta bilowga ah ee lagama maarmaanka u ah saga si ay u shaqeyso, iyo sidoo kale natiijooyin dhexdhexaad ah. Tusaalaha macnaha guud waxa loo gudbin doonaa dhammaan tillaabooyinka inta lagu jiro fulinta. Saga lafteedu waa fasal aan waddan lahayn, markaa tusaale ahaan waxaa lagu meelayn karaa DI sida Singleton si loo helo ku-tiirsanaanta lagama maarmaanka ah.

Tusaale xayaysiis

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

Tusaale ahaan wac:

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

Tusaalooyinka buuxa ee fulinta kala duwan ayaa la eegi karaa halkan iyo in shirka la imtixaanada.

ViennaNET.Orm.*

Qayb maktabado ah oo lagula shaqaynayo xog ururin kala duwan iyada oo loo sii marayo Nhibernate. Waxaan isticmaalnaa habka DB-First anagoo adeegsanayna Liquibase, sidaa darteed waxaa jira kaliya shaqeynta xogta ku jirta xogta diyaarsan.

ViennaNET.Orm.Seedwork и ViennaNET.Orm - shirarka waaweyn oo ka kooban is-dhexgalyo aasaasi ah iyo fulintooda, siday u kala horreeyaan. Aynu si faahfaahsan u eegno waxa ku jira.

interface IEntityFactoryService iyo fulinteeda EntityFactoryService waa meesha ugu weyn ee laga bilaabo la shaqeynta xogta, tan iyo Unugga Shaqada, kaydinta la shaqeynta hay'ado gaar ah, iyo sidoo kale fulinta amarada iyo weydiimaha tooska ah ee SQL ayaa halkan lagu abuuray. Mararka qaarkood way ku habboon tahay in la xaddido kartida fasalka ee la shaqeynta xogta, tusaale ahaan, si loo bixiyo awoodda akhrinta xogta. Xaaladahan oo kale IEntityFactoryService waxaa jira awoowe - interface IEntityRepositoryFactory, kaas oo kaliya ku dhawaaqaya habka loo abuurayo kaydka.

Si toos ah loo galo xogta xogta, habka bixiyaha ayaa la isticmaalaa. DBMS kasta oo aan u isticmaalno kooxaheena ayaa leh fulinteeda: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

Isla mar ahaantaana, dhowr bixiyeyaal ayaa lagu diwaangelin karaa hal codsi isku mar, taas oo u oggolaanaysa, tusaale ahaan, gudaha qaabka hal adeeg, iyada oo aan wax kharash ah lagu beddelin kaabayaasha, si ay u fuliyaan guuritaanka tallaabo tallaabo ah mid DBMS ah mid kale. Habka xulashada isku xirka loo baahan yahay iyo, sidaas darteed, bixiyaha koox gaar ah (kaaso khariidaynta miisaska xogta lagu qoray) waxaa lagu hirgeliyaa iyada oo la diiwaangelinayo cidda ku jirta fasalka BoundedContext (waxaa ku jira habka diiwaangelinta qaybaha domain) ama beddelkiisa ApplicationContext ( waxa ay ka kooban tahay habab loo diiwaan geliyo hay'adaha codsiga, codsiyada tooska ah iyo amarada), halkaas oo aqoonsiga isku xirka qaabeynta loo aqbalo dood ahaan:

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

Tusaale ApplicationContext:

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

Haddii aqoonsiga xiriirka aan la cayimin, markaa xiriirka la yiraahdo "default" ayaa la isticmaali doonaa.

Khariidaynta tooska ah ee hay'adaha miisaska xogta ayaa la hirgeliyay iyadoo la adeegsanayo qalabka NHibernate caadiga ah. Waxaad u isticmaali kartaa sharraxaadda labadaba xml faylasha iyo fasallada. Si aad u qorto habboon ee kaydka stubka ee imtixaannada Cutubka, waxa jira maktabad ViennaNET.TestUtils.Orm.

Tusaalooyinka buuxa ee isticmaalka ViennaNET.Orm.* waa la heli karaa halkan.

ViennaNET.Farriinta.*

Qayb maktabado ah oo loogu talagalay in lagu shaqeeyo safafka.

Si safafka loogu shaqeeyo, isla hab la mid ah ayaa la doortay sida DBMS-yada kala duwan, kuwaas oo ah, habka ugu badan ee suurtogalka ah ee midaysan marka la eego la shaqaynta maktabadda, iyadoon loo eegin maamulaha safka la isticmaalo. Maktabadda ViennaNET.Messaging ayaa si sax ah masuul uga ah midayntan, iyo ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue и ViennaNET.Messaging.KafkaQueue ka kooban fulinta adabtarada IBM MQ, RabbitMQ iyo Kafka, siday u kala horreeyaan.

Marka la shaqaynayo safafka, waxaa jira laba hab: helidda fariinta iyo diritaanka.

Tixgeli inaad hesho. Halkan waxaa jira 2 ikhtiyaar: dhegeysi joogto ah iyo helitaanka farriin keliya. Si aad si joogto ah u dhegeysato safka, waa in aad marka hore qeexdaa fasalka processor-ka laga dhaxlo IMessageProcessor, kaas oo masuul ka noqon doona habaynta fariinta soo socota. Marka xigta, waa in lagu "xiraa" saf gaar ah; tan waxaa lagu sameeyaa diiwaangelinta gudaha IQueueReactorFactory muujinta aqoonsiga safka qaabeynta:

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

Tusaalaha bilowga dhegeysiga:

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

Dabadeed, marka adeeggu bilaabmo ee habka loo yeero si loo bilaabo dhageysiga, dhammaan fariimaha ka imanaya safka la cayimay waxay aadi doonaan processor-ka u dhigma.

Si aad u hesho hal fariin gudaha interface warshad IMessagingComponentFactory waxaa jira hab CreateMessageReceiverkaas oo abuuri doona qaataha oo sugaya fariin ka socota safka loo cayimay:

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

Si aad fariin u dirto waxaad u baahan tahay inaad isticmaasho IMessagingComponentFactory oo samee fariin dire:

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

Waxaa jira saddex ikhtiyaar oo diyaarsan oo taxan iyo kala fogaynta fariinta: kaliya qoraal, XML iyo JSON, laakiin haddii loo baahdo, waxaad si fudud u samayn kartaa fulinta is-dhexgalkaaga. IMessageSerializer и IMessageDeserializer.

Waxaan isku daynay inaan ilaalino awoodaha gaarka ah ee maamule kasta oo saf ah, tusaale; ViennaNET.Messaging.MQSeriesQueue kuu ogolaanaya in aad u soo diri ma aha oo kaliya qoraal, laakiin sidoo kale fariimaha byte, iyo ViennaNET.Messaging.RabbitMQQueue wuxuu taageeraa safaynta iyo safka duulista. Duubabkayada adabtarada ee RabbitMQ waxa kale oo ay fulisaa qaar ka mid ah muuqaalada RPC: waxaanu dirnaa fariin waxaanan sugayna jawaabta safka ku meel gaadhka ah ee gaarka ah, kaas oo loo sameeyay kaliya hal fariin jawaab celin ah.

halkan tusaale isticmaalka safafka oo leh nuances xidhiidhka aasaasiga ah.

ViennaNET.CallContext

Waxaan u isticmaalnaa safafka kaliya ee isdhexgalka nidaamyada kala duwan, laakiin sidoo kale isgaarsiinta u dhexeeya adeegyadda yar-yar ee isla arjiga, tusaale ahaan, gudaha saga. Tani waxay keentay baahida loo qabo in la gudbiyo fariinta sida xogta kaaliyaha ah sida gelitaanka isticmaalaha, codsiga aqoonsiga gelitaanka dhamaadka-ilaa-dhamaadka, cinwaanka IP-ga iyo xogta oggolaanshaha. Si loo hirgeliyo gudbinta xogtan, waxaan sameynay maktabad ViennaNET.CallContext, kaas oo kuu ogolaanaya inaad kaydiso xogta codsiga gelaya adeegga. Xaaladdan oo kale, sida codsiga loo sameeyay, iyadoo saf ah ama Http, dhib ma leh. Dabadeed, ka hor inta aan la dirin codsiga ama farriinta baxaya, xogta waxaa laga soo qaatay macnaha guud waxaana la gelinayaa madaxyada. Sidaa darteed, adeegga soo socdaa wuxuu helayaa xogta kaalmada wuxuuna u maareeyaa si la mid ah.

Waad ku mahadsan tahay dareenkaaga, waxaan rajaynaynaa faallooyinkaaga oo aan jiidno codsiyada!

Source: www.habr.com

Add a comment