ViennaNET: txheej tsev qiv ntawv rau lub backend. Ntu 2

Raiffeisenbank lub zej zog tsim tawm .NET txuas ntxiv nws cov lus piav qhia luv luv ntawm ViennaNET. Kawm paub li cas thiab vim li cas peb thiaj li xaus li no. Koj tuaj yeem nyeem txog nws hauv thawj ntu.

Hauv tsab xov xwm no, peb yuav mus saib qee lub tsev qiv ntawv rau kev ua haujlwm nrog cov kev lag luam faib tawm, cov kab, thiab cov ntaub ntawv uas tseem tsis tau them, thiab uas tuaj yeem pom hauv peb lub GitHub repository (cov lej qhov chaw nyob ntawm no), thiab Cov pob khoom Nuget nyob ntawm no.

ViennaNET: txheej tsev qiv ntawv rau lub backend. Ntu 2

ViennaNET.Sagas

Thaum ib qhov project hloov mus rau DDD thiab microservices architecture, qhov kev sib cais ntawm kev lag luam thoob plaws ntau yam kev pabcuam ua rau muaj kev cov nyom ntawm kev siv cov txheej txheem kev sib pauv faib tawm, vim tias ntau qhov xwm txheej feem ntau npog ntau thaj chaw. Koj tuaj yeem kawm paub ntau ntxiv txog cov txheej txheem no, piv txwv li, ntawm nyob rau hauv phau ntawv "Microservices Patterns" los ntawm Chris Richardson.

Hauv peb cov haujlwm, peb tau siv ib txoj hauv kev yooj yim tab sis muaj txiaj ntsig: ib zaj dab neeg, lossis qhov tseeb dua, ib zaj dab neeg raws li kev sib koom ua ke. Nws lub ntsiab lus yog raws li nram no: muaj ib qho xwm txheej ua lag luam uas kev ua haujlwm yuav tsum tau ua tiav raws li cov kev pabcuam sib txawv. Yog tias muaj teeb meem tshwm sim ntawm txhua kauj ruam, yuav tsum hu rau cov txheej txheem rollback rau txhua kauj ruam dhau los uas ib qho tau muab. Yog li, thaum kawg ntawm zaj dab neeg, tsis hais txog kev vam meej, peb tau txais cov ntaub ntawv sib xws thoob plaws txhua qhov chaw.

Peb qhov kev siv tseem yog qhov yooj yim heev thiab tsis vam khom kev sib cuam tshuam nrog lwm cov kev pabcuam. Nws yooj yim siv: tsuas yog txais los ntawm chav kawm abstract SagaBase<T>, qhov twg T yog koj chav kawm context, uas tuaj yeem khaws cov ntaub ntawv pib xav tau rau zaj dab neeg, nrog rau qee qhov txiaj ntsig nruab nrab. Ib qho piv txwv context yuav raug xa mus rau txhua kauj ruam thaum lub sijhawm ua tiav. Zaj dab neeg nws tus kheej yog chav kawm tsis muaj xeev, yog li ib qho piv txwv tuaj yeem tso rau hauv DI ua Singleton kom tau txais cov kev vam khom tsim nyog.

Piv txwv kev tshaj tawm:

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

Piv txwv hu:

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

Cov piv txwv tag nrho ntawm ntau yam kev siv tuaj yeem saib tau no thiab hauv kev sib sau ua ke nrog kev ntsuam xyuas.

ViennaNET.Orm.*

Ib pawg ntawm cov tsev qiv ntawv rau kev ua haujlwm nrog ntau lub database los ntawm Nhibernate. Peb siv txoj hauv kev DB-First nrog Liquibase, yog li lub tsev qiv ntawv no tsuas muaj cov haujlwm rau kev ua haujlwm nrog cov ntaub ntawv hauv lub database uas twb muaj lawm.

ViennaNET.Orm.Seedwork и ViennaNET.Orm - cov rooj sib txoos tseem ceeb uas muaj cov interfaces hauv paus thiab lawv cov kev siv, raws li. Cia peb tshuaj xyuas lawv cov ntsiab lus kom ntxaws ntxiv.

interface IEntityFactoryService thiab nws txoj kev siv EntityFactoryService yog qhov pib tseem ceeb rau kev ua haujlwm nrog lub database, vim lawv tsim cov Chav Haujlwm, cov chaw khaws ntaub ntawv rau kev ua haujlwm nrog cov chaw tshwj xeeb, nrog rau cov neeg ua haujlwm ntawm cov lus txib thiab cov lus nug SQL ncaj qha. Qee lub sij hawm nws yooj yim los txwv cov chav kawm lub peev xwm rau kev ua haujlwm nrog lub database, piv txwv li, kom tsuas yog nyeem cov ntaub ntawv xwb. Rau cov xwm txheej zoo li no, IEntityFactoryService muaj ib tug poj koob yawm txwv - interface IEntityRepositoryFactory, uas tsuas yog tshaj tawm ib txoj kev rau kev tsim cov chaw cia khoom.

Yuav kom nkag mus rau hauv lub database ncaj qha, peb siv ib txoj kev muab kev pab. Txhua lub DBMS uas peb siv hauv peb cov pab pawg muaj nws tus kheej kev siv: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

Ntau tus neeg muab kev pabcuam tuaj yeem sau npe tib lub sijhawm hauv ib daim ntawv thov, uas tso cai rau, piv txwv li, kev tsiv mus los ntawm ib qho DBMS mus rau lwm qhov hauv ib qho kev pabcuam yam tsis muaj kev hloov kho vaj tse. Lub tshuab rau kev xaiv qhov kev sib txuas uas xav tau thiab, yog li ntawd, tus neeg muab kev pabcuam rau ib chav kawm tshwj xeeb (uas daim ntawv qhia rau DB cov lus tau sau) yog siv los ntawm kev sau npe rau lub chaw hauv chav kawm BoundedContext (uas muaj ib txoj kev rau kev sau npe rau cov chaw sau npe) lossis nws tus neeg ua tiav, ApplicationContext (uas muaj cov txheej txheem rau kev sau npe rau cov chaw thov, cov lus nug ncaj qha, thiab cov lus txib), qhov twg tus cim kev sib txuas los ntawm qhov kev teeb tsa tau txais ua ib qho kev sib cav:

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

Piv txwv ntawm Daim Ntawv Thov:

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

Yog tias tus lej txuas tsis tau teev tseg, qhov kev sib txuas hu ua "default" yuav raug siv.

Qhov kev kos duab ntawm cov chaw rau cov ntaub ntawv hauv paus ntaub ntawv yog siv los ntawm kev siv cov cuab yeej NHibernate txheem. Koj tuaj yeem siv ob qho tib si cov ntaub ntawv XML thiab cov chav kawm rau cov lus piav qhia. Muaj lub tsev qiv ntawv rau kev sau cov chaw khaws cia stub hauv cov kev xeem unit. ViennaNET.TestUtils.Orm.

Cov piv txwv tag nrho ntawm kev siv ViennaNET.Orm.* tuaj yeem pom no.

ViennaNET.Kev Xa Xov.*

Ib pawg ntawm cov tsev qiv ntawv rau kev ua haujlwm nrog cov queues.

Rau kev ua haujlwm nrog cov kab, tib txoj hauv kev tau raug xaiv ib yam li nrog ntau yam DBMS, uas yog, txoj hauv kev sib koom ua ke tshaj plaws hauv kev ua haujlwm nrog lub tsev qiv ntawv, tsis hais tus thawj tswj kab siv. ViennaNET.Messaging yog tus uas muaj lub luag haujlwm rau qhov kev sib koom ua ke no, thiab ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue и ViennaNET.Messaging.KafkaQueue muaj cov kev siv ntawm cov adapters rau IBM MQ, RabbitMQ thiab Kafka, raws li.

Muaj ob txoj hauv kev ua haujlwm nrog cov kab: txais cov lus thiab xa lawv.

Cia peb xav txog kev txais. Muaj ob txoj kev xaiv ntawm no: rau kev mloog tas mus li thiab rau kev txais ib cov lus. Txhawm rau mloog cov kab lus tas mus li, koj yuav tsum xub txhais ib chav kawm processor uas tau txais los ntawm IMessageProcessor, uas yuav yog lub luag haujlwm rau kev ua cov lus tuaj. Tom ntej no, nws yuav tsum "txuas" rau ib kab tshwj xeeb, uas yog ua los ntawm kev sau npe hauv IQueueReactorFactory qhia meej tus ID queue los ntawm qhov configuration:

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

Piv txwv ntawm kev pib mloog:

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

Tom qab ntawd, thaum qhov kev pabcuam pib thiab txoj kev pib mloog raug hu, tag nrho cov lus los ntawm kab teev tseg yuav mus rau lub processor sib xws.

Yuav kom tau txais ib qho lus hauv lub Hoobkas interface IMessagingComponentFactory muaj ib txoj kev CreateMessageReceiver, uas yuav tsim ib lub receiver uas tos ib cov lus los ntawm kab uas tau teev rau nws:

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

Xa lus koj yuav tsum siv tib yam IMessagingComponentFactory thiab tsim ib tus neeg xa xov:

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

Muaj peb txoj kev xaiv uas npaj txhij rau kev teeb tsa thiab tshem tawm cov lus: cov ntawv nyeem yooj yim, XML, thiab JSON, tab sis yog tias tsim nyog, koj tuaj yeem tsim koj tus kheej cov kev siv ntawm cov interfaces tau yooj yim. IMessageSerializer и IMessageDeserializer.

Peb tau sim khaws cov peev xwm tshwj xeeb ntawm txhua tus neeg saib xyuas kab, piv txwv li, ViennaNET.Messaging.MQSeriesQueue tso cai rau koj xa tsis yog cov lus ntawv xwb, tab sis kuj tseem xa cov lus byte, thiab ViennaNET.Messaging.RabbitMQQueue Txhawb kev tsim kab thiab kev tsim kab ke ntawm lub sijhawm. Peb lub adapter wrapper rau RabbitMQ kuj siv qee qhov kev ua haujlwm RPC: peb xa lus thiab tos kom teb los ntawm kab ke tshwj xeeb ib ntus uas tsim rau ib qho lus teb xwb.

no Ib qho piv txwv ntawm kev siv cov kab nrog cov nuances tseem ceeb ntawm kev sib txuas.

ViennaNET.CallContext

Peb siv cov kab ke tsis yog rau kev sib koom ua ke ntawm ntau lub tshuab xwb tab sis kuj rau kev sib txuas lus ntawm cov kev pabcuam me me hauv ib daim ntawv thov, piv txwv li, hauv ib zaj dab neeg. Qhov no yuav tsum tau xa cov ntaub ntawv pabcuam nrog rau cov lus, xws li tus neeg siv nkag mus, ID thov rau kev nkag mus rau qhov kawg, qhov chaw nyob IP, thiab cov ntaub ntawv tso cai. Txhawm rau siv kev xa cov ntaub ntawv no, peb tau tsim ib lub tsev qiv ntawv. ViennaNET.CallContext, uas tso cai rau khaws cov ntaub ntawv los ntawm qhov kev thov nkag mus rau ib qho kev pabcuam. Txawm hais tias qhov kev thov tau ua los ntawm kab lossis ntawm Http tsis muaj feem cuam tshuam. Tom qab ntawd, ua ntej xa qhov kev thov lossis cov lus xa tawm, cov ntaub ntawv raug rho tawm ntawm cov ntsiab lus thiab muab tso rau hauv cov headers. Txoj kev no, qhov kev pabcuam tom ntej tau txais cov ntaub ntawv pabcuam thiab tswj hwm nws zoo sib xws.

Ua tsaug rau koj qhov kev mloog, peb tos ntsoov rau koj cov lus tawm tswv yim thiab rub cov lus thov!

Tau qhov twg los: www.hab.com