ViennaNET: seti yemaraibhurari eiyo backend. Chikamu 2

Raiffeisenbank's .NET developer community inoenderera mberi nepfupiso yayo yeViennaNET. Dzidza kuti sei uye sei takasvika pamhedziso iyi. Unogona kuverenga nezvazvo muchikamu chekutanga.

Muchinyorwa chino, tichaenda pamusoro pemamwe maraibhurari ekushanda neakagoverwa transaction, mitsetse, uye dhatabhesi izvo zvisati zvavharwa, uye izvo zvinogona kuwanikwa mune yedu GitHub repository (source code iri pano), a Nuget mapakeji ari pano.

ViennaNET: seti yemaraibhurari eiyo backend. Chikamu 2

ViennaNET.Sagas

Kana purojekiti ichichinjira kuenda kuDDD uye mamicroservices architecture, kupatsanurwa kwebhizinesi pfungwa kumasevhisi akasiyana kunoisa dambudziko rekushandisa nzira yekutengeserana yakagoverwa, sezvo akawanda mamiriro anowanzo tora nzvimbo dzakawanda. Iwe unogona kudzidza zvakawanda nezvezvirongwa izvi, semuenzaniso, pa mubhuku rinonzi "Microservices Patterns" naChris Richardson.

Mumapurojekiti edu, takashandisa nzira yakapfava asi inobatsira: saga, kana kuti chaizvo, saga-yakavakirwa pamutambo. Hunhu hwayo hwakaita seizvi: pane bhizinesi mamiriro umo mashandiro anofanirwa kuitwa zvakateerana pamasevhisi akasiyana. Kana chero matambudziko akamuka pane chero nhanho, nzira yekudzosera kumashure inofanirwa kushevedzwa kune ese apfuura matanho apo imwe yakapihwa. Saka, pakupera kwesaga, zvisinei nekubudirira, tinowana data inowirirana munzvimbo dzese.

Kuita kwedu kuchiri kwakakosha uye hakuvimbi nekudyidzana nemamwe masevhisi. Zviri nyore kushandisa: ingogara nhaka kubva kune base abstract kirasi SagaBase <T>, uko T ndiyo kirasi yako yemamiriro, iyo inogona kuchengetedza yekutanga data inodiwa kune iyo saga, pamwe nemamwe epakati mhedzisiro. Muenzaniso wemamiriro ezvinhu uchapfuudzwa kumatanho ese panguva yekuitwa. Iyo saga pachayo ikirasi isina nyika, saka muenzaniso unogona kuiswa muDI seSingleton kuti uwane zvinodiwa.

Muenzaniso ad:

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

Muenzaniso kufona:

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

Mienzaniso yakazara yekushandiswa kwakasiyana inogona kutariswa pano uye paungano na miedzo.

ViennaNET.Orm.*

Seti yemaraibhurari ekushanda neakasiyana dhatabhesi kuburikidza neNhibernate. Isu tinoshandisa iyo DB-Yekutanga maitiro neLiquibase, saka raibhurari iyi inongosanganisira mashandiro ekushanda nedata mudhatabhesi iripo.

ViennaNET.Orm.Seedwork и ViennaNET.Orm - magungano makuru ane base interfaces uye mashandisirwo awo, zvichiteerana. Ngationgororei zvirimo zvakadzama.

inowanikwa IEntityFactoryService uye kuitwa kwayo EntityFactoryService ndiyo nzvimbo huru yekutanga yekushanda nedhatabhesi, pavanenge vachigadzira Units of Work, repositories yekushanda nemasangano chaiwo, pamwe nevaiti vemirairo uye yakananga SQL mibvunzo. Dzimwe nguva zviri nyore kudzikamisa kugona kwekirasi kushanda nedhatabhesi, semuenzaniso, kubvumidza kuverenga chete kwedata. Muzviitiko zvakadaro, IEntityFactoryService pane madzitateguru - interface IEntityRepositoryFactory, iyo inongozivisa nzira yekugadzira marepositori.

Kuti tiwane zvakananga dhatabhesi, isu tinoshandisa nzira yekupa. Imwe neimwe DBMS yatinoshandisa muzvikwata zvedu ine yayo kuita kwayo: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

Vazhinji vanopa vanogona kunyoreswa panguva imwe chete mune imwe application, vachibvumira, semuenzaniso, nhanho-nhanho kutama kubva kune imwe DBMS kuenda kune imwe mukati mesevhisi imwe chete pasina chero shanduko yezvivakwa. Iyo nzira yekusarudza chinongedzo chinodiwa uye, nekudaro, mupi wechimwe kirasi kirasi (iyo inonyorerwa mepu kune DB matafura) inoitwa nekunyoresa sangano muBoundedContext kirasi (iyo ine nzira yekunyoresa domain entities) kana mutsivi wayo, ApplicationContext (iyo ine nzira dzekunyoresa maapplication masangano, nemirairo inogamuchirwa kubva kune inogamuchirwa mibvunzo), nharo:

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

Muenzaniso ApplicationContext:

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

Kana iyo ID yekubatanidza isina kutaurwa, iyo yekubatanidza inonzi "default" ichashandiswa.

Iwo chaiwo mepu yemasangano kumatafura edatabase anoitwa uchishandisa akajairwa NHibernate maturusi. Unogona kushandisa ese mafaera eXML uye makirasi kune tsananguro. Raibhurari iripo yekunyora zviri nyore stub repositories mumayuniti bvunzo. ViennaNET.TestUtils.Orm.

Mienzaniso yakazara yekushandisa ViennaNET.Orm.* inogona kuwanikwa pano.

ViennaNET.Messaging.*

Seti yemaraibhurari ekushanda nemitsara.

Pakushanda nemitsara, nzira imwechete yakasarudzwa seDBMS yakasiyana-siyana, iyo inogoneka yakabatana maererano nekushanda neraibhurari, pasinei nemutungamiri wemutsara anoshandiswa. Library ViennaNET.Messaging ndiye ane mhosva yekubatana uku, uye ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue и ViennaNET.Messaging.KafkaQueue ine mashandisirwo emaadapter eBMM MQ, RabbitMQ uye Kafka, zvichiteerana.

Pane maitiro maviri ekushanda nemitsara: kugamuchira mameseji nekuatumira.

Ngatifungei kugamuchira. Pane zvingasarudzwa zviviri pano: zvekuramba uchiteerera uye nekugamuchira meseji imwechete. Kuti urambe uchiteerera kumutsara, unofanira kutanga watsanangura processor kirasi yakagarwa nhaka kubva IMessageProcessor, iyo ichava nebasa rekugadzirisa meseji inouya. Tevere, inofanirwa "kubatanidzwa" kune chaiyo mutsara, iyo inoitwa nekunyoresa mukati IQueueReactorFactory kutsanangura iyo queue ID kubva pakugadziriswa:

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

Muenzaniso wekutanga kuteerera:

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

Zvino, kana sevhisi yatanga uye nzira yekutanga kuterera inodanwa, mameseji ese kubva pamutsetse wakatarwa anoenda kune inoenderana processor.

Kugamuchira meseji imwe chete mufekitori yeinterface IMessagingComponentFactory pane nzira CreateMessageReceiver, iyo ichagadzira mugamuchiri anomirira meseji kubva pamutsetse wakatarwa kwairi:

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

Kutumira meseji unofanira kushandisa zvakafanana IMessagingComponentFactory uye gadzira anotumira meseji:

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

Pane matatu akagadzirira-akagadzirwa sarudzo dzekuseriza uye deserializing mameseji: yakajeka mameseji, XML, uye JSON, asi kana zvichidikanwa, unogona nyore kugadzira yako pachako mashandisirwo eiyo interfaces. IMessageSerializer и IMessageDeserializer.

Takaedza kuchengetedza kugona kwakasiyana kwemaneja wega wega wemutsetse, semuenzaniso, ViennaNET.Messaging.MQSeriesQueue inokubvumira kutumira kwete mameseji chete, asiwo mameseji e-byte, uye ViennaNET.Messaging.RabbitMQQueue Inotsigira nzira uye pa-iyo-inobhururuka kugadzira mutsara. Yedu adapta yekuputira yeRabbitMQ zvakare inoshandisa imwe RPC mashandiro: isu tinotumira meseji uye tinomirira mhinduro kubva kune yakakosha mutsara wenguva pfupi wakagadzirirwa meseji yekupindura imwe chete.

pano Muenzaniso wekushandisa mitsetse ine main nuances yekubatanidza.

ViennaNET.CallContext

Isu tinoshandisa mitsetse kwete chete yekubatanidza pakati peakasiyana masisitimu asiwo yekukurukurirana pakati pemicroservices mukati meimwe application, semuenzaniso, mukati mesaga. Izvi zvaiita kuti kufambiswe kwe data rebetsero pamwe chete nemeseji, senge mushandisi wekupinda, kukumbira ID yekupera-kusvika-kumagumo kutema, kunobva IP kero, uye data remvumo. Kuti tiite kutumirwa kwedata iri, takagadzira raibhurari. ViennaNET.CallContext, iyo inobvumira kuchengetedza data kubva kuchikumbiro chinouya kune sevhisi. Kuti chikumbiro chakaitwa kuburikidza nemutsara kana kuburikidza neHttp hazvina basa. Zvadaro, usati watumira chikumbiro chinobuda kana meseji, iyo data inotorwa kubva pane iyo mamiriro uye yakaiswa mumusoro. Nenzira iyi, iyo inotevera sevhisi inogamuchira iyo yebetsero data uye inoibata zvakafanana.

Ndatenda nekutarisisa kwako, tinotarisira kune zvaunotaura uye kudhonza zvikumbiro!

Source: www.habr.com