ViennaNET: se seti o faletusi mo le pito i tua. Vaega 2

Le Raiffeisenbank .NET developer community o loʻo faʻaauau pea ona toe iloilo faʻapuupuu mea o loʻo i totonu o ViennaNET. E uiga i le auala ma pe aisea na tatou o mai ai i lenei mea, e mafai ona e faitau i le vaega muamua.

I totonu o lenei tusiga, o le a matou uia faletusi e leʻi mafaufauina mo le galulue faʻatasi ma fefaʻatauaʻiga tufatufaina, laina ma faʻamaumauga, lea e mafai ona maua i totonu o le matou GitHub repository (o lo'o iai iinei), ma Nuget afifi iinei.

ViennaNET: se seti o faletusi mo le pito i tua. Vaega 2

ViennaNET.Sagas

Pe a sui se poloketi i le DDD ma le microservice architecture, ona faʻasalalau lea o faʻamatalaga pisinisi i 'auʻaunaga eseese, e tulaʻi mai se faʻafitauli e fesoʻotaʻi ma le manaʻoga e faʻatino se faʻasalalauga fefaʻatauaʻiga, aua o le tele o faʻaaliga e masani ona aʻafia ai le tele o vaega i le taimi e tasi. E mafai ona e faʻamasani i ia masini i nisi auiliiliga, mo se faʻataʻitaʻiga, i le tusi "Microservices Patterns", Chris Richardson.

I a matou poloketi, ua matou faʻatinoina se faiga faigofie ae aoga: o se saga, poʻo se faʻasologa faʻavae saga. O lona uiga e faʻapea: o loʻo i ai se faʻataʻitaʻiga pisinisi lea e tatau ai ona faʻagasolo faʻagaioiga i auaunaga eseese, ma afai ei ai ni faʻafitauli e tulaʻi mai i soʻo se laasaga, e tatau ona valaʻau le rollback procedure mo laasaga uma muamua, pe a iai. saunia. O le mea lea, i le faaiuga o le saga, e tusa lava po o le a le manuia, matou te maua faʻamaumauga tumau i vaega uma.

O loʻo faia pea la matou faʻatinoga i lona tulaga faʻavae ma e le o noatia i le faʻaogaina o soʻo se auala o fegalegaleaiga ma isi auaunaga. E le faigata ona faʻaoga: naʻo le faia o se tupuaga o le vasega abstract base SagaBase<T>, o le T o lau vasega faʻasalalauga lea e mafai ona e teuina ai faʻamatalaga muamua e manaʻomia mo le saga e galue, faʻapea foʻi ma nisi faʻaiʻuga. O le fa'ata'ita'iga fa'ata'ita'iga o le a tu'uina atu i la'asaga uma i le taimi o le fa'atinoga. Saga lava ia o se vasega e leai ni setete, o lea e mafai ai ona tuʻuina le faʻataʻitaʻiga i DI o se Singleton e maua ai faʻalagolago talafeagai.

Fa'ata'ita'iga fa'asalalauga:

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

Fa'ata'ita'iga vala'au:

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

E mafai ona va'aia fa'ata'ita'iga atoatoa o fa'atinoga 'ese'ese iinei ma i le faapotopotoga ma suega.

ViennaNET.Orm.*

Se seti o faletusi mo le galulue faatasi ma faʻamaumauga eseese e ala i le Nhibernate. Matou te faʻaogaina le DB-First approach e faʻaaoga ai le Liquibase, o lea e naʻo le faʻatinoina o galuega mo le galue ma faʻamaumauga i totonu o se faʻamaumauga ua saunia.

ViennaNET.Orm.Seedwork и ViennaNET.Orm - fa'apotopotoga autu o lo'o iai feso'ota'iga fa'avae ma a latou fa'atinoga, fa'asologa. Seʻi o tatou vaʻavaʻai atili i mea o loʻo i totonu.

Ofisa IEntityFactoryService ma lona faatinoina EntityFactoryService o le amataga autu lea mo le galulue faatasi ma le database, talu ai o le Unit of Work, fale teu oloa mo le galulue faatasi ma faʻalapotopotoga faʻapitoa, faʻapea foʻi ma faʻatonuina o faʻatonuga ma fesili tuusaʻo SQL o loʻo faia iinei. O nisi taimi e faigofie le faʻatapulaʻaina o gafatia o se vasega mo le galue ma se faʻamaumauga, mo se faʻataʻitaʻiga, e tuʻuina atu le mafai e naʻo le faitau faʻamatalaga. Mo tulaga faapena IEntityFactoryService o lo'o i ai se tuaa - fa'afeso'ota'i IEntityRepositoryFactory, lea e naʻo le faʻaalia o se auala mo le fatuina o fale teu oloa.

Ina ia maua saʻo le faʻamaumauga, o loʻo faʻaogaina le masini e tuʻuina atu. O DBMS taʻitasi matou te faʻaogaina i a matou 'au e iai lana lava faʻatinoga: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

I le taimi lava e tasi, e tele kamupani e mafai ona resitalaina i le tasi talosaga i le taimi e tasi, lea e mafai ai, mo se faʻataʻitaʻiga, i totonu o le auʻaunaga e tasi, e aunoa ma se tau mo le faʻaleleia o atinaʻe, e faia ai se laʻasaga taʻitasi laʻasaga mai le tasi DBMS i le isi. O le faiga mo le filifilia o le fesoʻotaʻiga manaʻomia ma, o le mea lea, o le tuʻuina atu mo se vasega faʻapitoa (lea o loʻo tusia ai faʻafanua i laulau faʻamaumauga) e faʻatinoina e ala i le resitalaina o le faʻalapotopotoga i le vasega BoundedContext (o loʻo i ai se metotia mo le resitalaina o faʻalapotopotoga) poʻo lona sui. ApplicationContext (o loʻo i ai metotia mo le resitalaina o faʻalapotopotoga talosaga, talosaga tuusaʻo ma faʻatonuga), lea e talia ai le faʻamatalaga fesoʻotaʻiga mai le faʻatulagaga e fai ma finauga:

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

Faataitaiga ApplicationContext:

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

Afai e le o faʻamaonia le ID fesoʻotaʻiga, ona faʻaogaina lea o le fesoʻotaʻiga ua taʻua o le "default".

O fa'afanua tu'usa'o o fa'alapotopotoga i laulau fa'amaumauga o lo'o fa'atinoina i le fa'aogaina o meafaigaluega masani a le NHibernate. E mafai ona e faʻaogaina le faʻamatalaga e ala i faila xml ma vasega. Mo le faigofie ona tusia o fale teu oloa i su'ega Unit, o lo'o iai le faletusi ViennaNET.TestUtils.Orm.

O fa'ata'ita'iga atoa o le fa'aogaina o ViennaNET.Orm.* e mafai ona maua iinei.

ViennaNET.Messaging.*

Se seti o faletusi mo le galue i laina.

Ina ia galue ma laina, o le auala lava lea e tasi na filifilia e pei o DBMS eseese, o lona uiga, o le maualuga e mafai ona tuʻufaʻatasia auala e tusa ai ma le galue ma le faletusi, e tusa lava po o le a le pule o loʻo faʻaaogaina. Faletusi ViennaNET.Messaging e nafa tonu lava mo lenei tuufaatasia, ma ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue и ViennaNET.Messaging.KafkaQueue o lo'o i ai fa'atinoga fa'apipi'i mo IBM MQ, RabbitMQ ma Kafka.

Pe a galue ma laina, e lua faiga: mauaina o se savali ma auina atu.

Mafaufau e maua. E 2 filifiliga iinei: mo le faʻalogo faifaipea ma mo le mauaina o se savali e tasi. Ina ia faʻalogo i taimi uma i le laina, e tatau ona e faʻamatala muamua le vasega processor na maua mai IMessageProcessor, lea o le a nafa ma le faagasologa o le savali o loʻo oʻo mai. O le isi, e tatau ona "sootai" i se laina patino; e faia lea e ala i le resitalaina i totonu IQueueReactorFactory fa'aalia le fa'ailoga fa'ailoga mai le fa'atulagaina:

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

Faataitaiga o le amata faalogo:

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

Ma, pe a amata le auaunaga ma valaʻau le auala e amata faʻalogo ai, o feʻau uma mai le faʻailoga faʻapitoa o le a alu i le gaioiga talafeagai.

Ina ia maua se savali e tasi i totonu o se fale gaosi oloa IMessagingComponentFactory e iai se metotia CreateMessageReceiverlea o le a fatuina ai se tagata e mauaina e faʻatali mo se feʻau mai le laina faʻamaonia i ai:

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

E auina atu se savali e tatau ona e faʻaaogaina tutusa IMessagingComponentFactory ma fai se tagata e auina atu savali:

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

E tolu filifiliga ua saunia mo le faʻasalalauina ma le faʻaleagaina o se feʻau: naʻo le tusiga, XML ma le JSON, ae afai e manaʻomia, e faigofie ona e faia au oe lava faʻatinoga faʻaoga. IMessageSerializer и IMessageDeserializer.

Sa matou taumafai e faʻasaoina le gafatia tulaga ese o pule taʻitasi taʻitasi, eg. ViennaNET.Messaging.MQSeriesQueue e mafai ai ona e auina atu e le gata i tusitusiga, ae faapea foi savali byte, ma ViennaNET.Messaging.RabbitMQQueue lagolagoina le ta'avale ma le fa'asologa o laina. O la matou fa'apipi'i fa'apipi'i mo RabbitMQ o lo'o fa'atinoina fo'i se fa'atusa o le RPC: matou te lafo atu se fe'au ma fa'atali se tali mai se laina fa'apitoa le tumau, lea e faia mo na'o le tasi le fe'au tali.

iinei o se faʻataʻitaʻiga o le faʻaogaina o laina faʻatasi ma nuances fesoʻotaʻiga faavae.

ViennaNET.CallContext

Matou te faʻaogaina laina e le gata mo le tuʻufaʻatasia i le va o faiga eseese, ae faʻapea foʻi mo fesoʻotaʻiga i le va o microservices o le talosaga lava e tasi, mo se faʻataʻitaʻiga, i totonu o se saga. O lenei mea na mafua ai le manaʻoga e tuʻuina atu faʻatasi ma le feʻau faʻamatalaga fesoasoani e pei o le saini a le tagata faʻaoga, faʻamatalaga faʻamatalaga mo le faʻauʻuga pito i luga, tuatusi IP puna ma faʻamatalaga faʻatagaina. Ina ia faʻatinoina le tuʻuina atu o nei faʻamatalaga, matou fausia se faletusi ViennaNET.CallContext, lea e mafai ai ona e teuina faʻamatalaga mai se talosaga e ulufale i le auaunaga. I lenei tulaga, pe na faapefea ona faia le talosaga, e ala i se laina poʻo le Http, e le afaina. Ma, aʻo leʻi tuʻuina atu le talosaga i fafo poʻo le feʻau, e ave faʻamaumauga mai le tala ma tuʻu i totonu o ulutala. O le mea lea, o le isi auʻaunaga e mauaina faʻamaumauga fesoasoani ma faʻatautaia i le auala lava e tasi.

Faafetai mo lou gauai, matou te tulimatai atu i au faʻamatalaga ma toso talosaga!

puna: www.habr.com

Faaopoopo i ai se faamatalaga