ViennaNET: sehlopha sa lilaeborari bakeng sa backend. Karolo ea 2

Sechaba sa baetsi ba Raiffeisenbank .NET se ntse se tsoela pele ho hlahloba ka bokhutšoanyane litaba tsa ViennaNET. Mabapi le hore na ke hobane'ng ha re tlile tabeng ena, o ka bala karolo ya pele.

Sengoliloeng sena, re tla feta lilaebraring tse ntseng li tla nkuoa bakeng sa ho sebetsa ka litšebelisano tse ajoang, mela le li-database, tse ka fumanoang polokelong ea rona ea GitHub (mehloli e teng mona), le Liphutheloana tsa Nuget mona.

ViennaNET: sehlopha sa lilaeborari bakeng sa backend. Karolo ea 2

ViennaNET.Sagas

Ha morero o fetohela ho DDD le meralo ea microservice, joale ha logic ea khoebo e ajoa ho pholletsa le lits'ebeletso tse fapaneng, ho hlaha bothata bo amanang le tlhokahalo ea ho kenya ts'ebetsong mochine oa transaction o abuoang, hobane maemo a mangata a atisa ho ama libaka tse 'maloa ka nako e le' ngoe. U ka tloaelana le mekhoa e joalo ka botlalo, mohlala, bukeng ea "Microservices Patterns", Chris Richardson.

Mererong ea rona, re kentse tšebetsong mokhoa o bonolo empa o le molemo: saga, kapa saga e thehiloeng ho 'mino oa liletsa. Motso oa eona ke ka tsela e latelang: ho na le boemo bo itseng ba khoebo moo ho hlokahalang ho etsa ts'ebetso ka tatellano litšebeletsong tse fapaneng, 'me haeba mathata a hlaha ka mohato ofe kapa ofe, hoa hlokahala ho letsetsa mokhoa oa ho khutlisa mehato eohle e fetileng, moo e leng teng. faneng ka. Kahoo, qetellong ea saga, ho sa tsotellehe katleho, re fumana boitsebiso bo tsitsitseng libakeng tsohle.

Ts'ebetsong ea rona e ntse e etsoa ka mokhoa oa eona oa motheo 'me ha e tlameletsoe ho sebelisoa ha mekhoa leha e le efe ea ho sebelisana le litšebeletso tse ling. Ha ho thata ho e sebelisa: etsa feela setloholo sa sehlopha sa motheo sa abstract SagaBase, moo T e leng sehlopha sa hau sa maemo moo u ka bolokang lintlha tsa pele tse hlokahalang bakeng sa saga ho sebetsa, hammoho le liphetho tse ling tsa bohareng. Mohlala oa moelelo o tla fetisoa ho mehato eohle nakong ea ts'ebetso. Saga ka boeona ke sehlopha se se nang maemo, kahoo mohlala o ka beoa ho DI joalo ka Singleton ho fumana litšepe tse hlokahalang.

Mohlala oa papatso:

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

Mohala oa mohlala:

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

Mehlala e felletseng ea ts'ebetsong e fapaneng e ka shejoa mona le kopanong le liteko.

ViennaNET.Orm.*

Sehlopha sa lilaeborari tsa ho sebetsa ka li-database tse fapaneng ka Nhibernate. Re sebelisa mokhoa oa DB-First ho sebelisa Liquibase, kahoo ho na le ts'ebetso feela ea ho sebetsa le data ka har'a database e lokiselitsoeng.

ViennaNET.Orm.Seedwork и ViennaNET.Orm - likopano tse kholo tse nang le li-interfaces tsa motheo le ts'ebetsong ea tsona, ka ho latellana. Ha re shebe litaba tsa bona ka botlalo.

segokanyimmediamentsi sa sebolokigolo IEntityFactoryService le ho kenngwa tshebetsong ha yona EntityFactoryService ke ntlha ea mantlha ea ho sebetsa le database, kaha Yuniti ea Mosebetsi, polokelo ea polokelo ea ho sebetsa le mekhatlo e itseng, hammoho le baphethahatsi ba litaelo le lipotso tse tobileng tsa SQL li thehiloe mona. Ka linako tse ling ho bonolo ho fokotsa bokhoni ba sehlopha sa ho sebetsa le database, mohlala, ho fana ka bokhoni ba ho bala data feela. Bakeng sa linyeoe tse joalo IEntityFactoryService ho na le sehokelo sa baholo-holo IEntityRepositoryFactory, e bolelang feela mokhoa oa ho theha polokelo.

Ho fihlella database ka kotloloho, ho sebelisoa mochine oa mofani. DBMS ka 'ngoe eo re e sebelisang lihlopheng tsa rona e na le ts'ebetsong ea eona: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

Ka nako e ts'oanang, bafani ba 'maloa ba ka ngolisoa ka kopo e le' ngoe ka nako e le 'ngoe, e leng se lumellang, ka mohlala, ka har'a moralo oa ts'ebeletso e le' ngoe, ntle le litšenyehelo tsa ho fetola lisebelisoa tsa motheo, ho etsa mohato ka mohato ho falla ho tloha. DBMS e 'ngoe ho ea ho e' ngoe. Mokhoa oa ho khetha khokahano e hlokahalang, ka hona, mofani oa sehlopha se itseng (seo ho ngoloang litafole tsa database) o kengoa ts'ebetsong ka ho ngolisa setheo ho sehlopha sa BoundedContext (e na le mokhoa oa ho ngolisa mekhatlo ea domain) kapa mohlahlami oa eona. ApplicationContext (e na le mekhoa ea ho ngolisa mekhatlo ea likopo, likopo tse tobileng le litaelo), moo sesupo sa khokahano ho tsoa ho tlhophiso se amoheloang e le khang:

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

Mohlala oa TšebelisoContext:

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

Haeba ID ea khokahano e sa hlalosoa, khokahano e bitsoang "default" e tla sebelisoa.

'Mapa o tobileng oa mekhatlo ho litafole tsa database o kengoa ts'ebetsong ho sebelisoa lisebelisoa tse tloaelehileng tsa NHibernate. U ka sebelisa tlhaloso ka bobeli ka lifaele tsa xml le ka lihlopha. Bakeng sa ho ngola habonolo ha li-stub repositories litekong tsa Unit, ho na le laeborari ViennaNET.TestUtils.Orm.

Mehlala e felletseng ea ho sebelisa ViennaNET.Orm.* e ka fumanoa mona.

ViennaNET.Melaetsa.*

Sehlopha sa lilaeborari tsa ho sebetsa ka mela.

Ho sebetsa ka mela, mokhoa o ts'oanang o ile oa khethoa joalo ka li-DBMS tse fapaneng, e leng, mokhoa o phahameng ka ho fetesisa o kopaneng mabapi le ho sebetsa le laeborari, ho sa tsotelehe mookameli oa mokoloko ea sebelisitsoeng. Laebrari ViennaNET.Messaging e ikarabella hantle bakeng sa kopano ena, le ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue и ViennaNET.Messaging.KafkaQueue e na le lisebelisoa tsa adapter bakeng sa IBM MQ, RabbitMQ le Kafka, ka ho latellana.

Ha u sebetsa ka mela, ho na le mekhoa e 'meli: ho amohela molaetsa le ho o romela.

Nahana ka ho amohela. Ho na le likhetho tse 2 mona: bakeng sa ho mamela khafetsa le ho amohela molaetsa o le mong. Ho lula u mamela letoto, u tlameha ho hlalosa pele sehlopha sa processor se futsitsoeng ho sona IMessageProcessor, e tla ikarabella bakeng sa ho sebetsana le molaetsa o kenang. Ka mor'a moo, e tlameha ho "hokahana" le mokoloko o itseng; sena se etsoa ka ho ingolisa IQueueReactorFactory e bonts'a sekhetho sa mokoloko ho tsoa ho tlhophiso:

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

Mohlala oa ho qala ho mamela:

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

Joale, ha ts'ebeletso e qala mme mokhoa o bitsoa ho qala ho mamela, melaetsa eohle e tsoang moleng o boletsoeng e tla ea ho processor e lumellanang.

Ho amohela molaetsa o le mong ka sebopeho sa feme IMessagingComponentFactory ho na le mokhoa CreateMessageReceivere tla etsa hore moamoheli a emele molaetsa ho tsoa meleng e boletsoeng ho eona:

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

Ho romela molaetsa u hloka ho sebelisa se tšoanang IMessagingComponentFactory 'me u thehe motho ea romellang molaetsa:

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

Ho na le likhetho tse tharo tse lokiselitsoeng ho hlophisa le ho hlakola molaetsa: mongolo feela, XML le JSON, empa ha ho hlokahala, o ka iketsetsa lits'ebetso tsa hau habonolo. IMessageSerializer и IMessageDeserializer.

Re lekile ho boloka bokhoni bo ikhethang ba molaoli e mong le e mong oa mokoloko, mohlala. ViennaNET.Messaging.MQSeriesQueue e o lumella ho romella eseng feela mongolo, empa hape le melaetsa ea byte, le ViennaNET.Messaging.RabbitMQQueue e tshehetsa ho thula tsela le ho koloka ha sefofane. Sephutheloana sa rona sa adaptara bakeng sa RabbitMQ se boetse se sebelisa sebopeho se itseng sa RPC: re romella molaetsa ebe re emela karabo ho tsoa ho letoto le khethehileng la nakoana, le etselitsoeng molaetsa o le mong feela oa karabo.

mona mohlala wa ho sebedisa mela e nang le maqhama a motheo a kgokelo.

ViennaNET.CallContext

Ha re sebelise melato feela bakeng sa ho kopanya lipakeng tsa litsamaiso tse fapaneng, empa hape le puisano lipakeng tsa li-microservices tsa ts'ebeliso e ts'oanang, mohlala, ka har'a saga. Sena se ile sa etsa hore ho be le tlhokahalo ea ho fetisa molaetsa hammoho le lintlha tse thusang tse kang ho kena ha mosebedisi, kopo ea boitsebiso bakeng sa ho rema lifate ho tloha qetellong, aterese ea IP ea mohloli le boitsebiso ba tumello. Ho kenya ts'ebetsong phetiso ea data ena, re ile ra theha laeborari ViennaNET.CallContext, e u lumellang ho boloka data ho tsoa kopo e kenang ts'ebeletso. Tabeng ena, tsela eo kopo e entsoeng ka eona, ka mokoloko kapa ka Http, ha ho tsotellehe. Ebe, pele o romella kopo kapa molaetsa o tsoang, data e nkuoa ho tsoa moelelong ebe e beoa lihloohong. Ka hona, ts'ebeletso e latelang e fumana data e thusang mme e e laola ka tsela e ts'oanang.

Re leboha tlhokomelo ea hau, re lebelletse maikutlo a hau le likopo tsa hau!

Source: www.habr.com

Eketsa ka tlhaloso