ViennaNET: saitin ɗakunan karatu na baya. Kashi na 2

Ƙungiyar masu haɓaka Raiffeisenbank .NET ta ci gaba da yin bitar abubuwan da ke cikin ViennaNET a taƙaice. Game da yadda kuma dalilin da ya sa muka zo wannan, zaka iya karanta kashi na farko.

A cikin wannan labarin, za mu shiga cikin ɗakunan karatu waɗanda ba a yi la'akari da su ba don aiki tare da ma'amaloli da aka rarraba, jerin gwano da bayanan bayanai, waɗanda za a iya samu a cikin ma'ajin GitHub (kafofin suna nan), da Kunshin Nuget nan.

ViennaNET: saitin ɗakunan karatu na baya. Kashi na 2

ViennaNET.Sagas

Lokacin da aikin ya canza zuwa DDD da microservice gine, to, lokacin da aka rarraba dabarun kasuwanci a cikin ayyuka daban-daban, matsala ta taso game da buƙatar aiwatar da tsarin ma'amala da aka rarraba, saboda yawancin al'amuran sau da yawa suna shafar yankuna da yawa a lokaci ɗaya. Kuna iya sanin irin waɗannan hanyoyin dalla-dalla, misali, a cikin littafin "Microservices Patterns", Chris Richardson.

A cikin ayyukanmu, mun aiwatar da tsari mai sauƙi amma mai amfani: saga, ko kuma saga na tushen ƙungiyar kade-kade. Asalinsa shine kamar haka: akwai wani yanayin kasuwanci wanda ya wajaba don aiwatar da ayyuka a cikin ayyuka daban-daban, kuma idan wasu matsaloli sun taso a kowane mataki, ya wajaba a kira hanyar dawo da duk matakan da suka gabata, inda yake. bayar da. Don haka, a ƙarshen saga, ba tare da la'akari da nasara ba, muna karɓar daidaitattun bayanai a duk yankuna.

Aiwatar da aiwatar da mu har yanzu ana yin ta a cikin ainihin tsari kuma ba a haɗa shi da amfani da kowane hanyoyin hulɗa tare da wasu ayyuka ba. Ba shi da wahala a yi amfani da shi: kawai sanya zuriyar saƙon abstract SagaBase <T>, inda T shine ajin mahallin ku wanda zaku iya adana bayanan farko da ake buƙata don saga yayi aiki, da kuma wasu matsakaicin sakamako. Za a wuce misalin mahallin zuwa duk matakai yayin aiwatarwa. Saga da kanta aji ne mara jiha, don haka ana iya sanya misalin a DI azaman Singleton don samun abubuwan dogaro da suka dace.

Misali talla:

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

Misali kira:

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

Ana iya duba cikakkun misalan aiwatarwa daban-daban a nan kuma a majalisa tare da gwaje-gwaje.

ViennaNET.Orm.*

Saitin ɗakunan karatu don aiki tare da bayanai daban-daban ta hanyar Nhibernate. Muna amfani da tsarin DB-First ta amfani da Liquibase, don haka akwai ayyuka kawai don aiki tare da bayanai a cikin bayanan da aka shirya.

ViennaNET.Orm.Seedwork и ViennaNET.Orm - manyan majalisu masu ƙunshe da hanyoyin sadarwa na asali da aiwatar da su, bi da bi. Bari mu dubi abubuwan da ke cikin su dalla-dalla.

dubawa IEntityFactoryService da aiwatar da shi EntityFactoryService su ne babban wurin farawa don aiki tare da bayanan, tun daga Unit of Work, ma'ajiyar aiki tare da takamaiman ƙungiyoyi, da masu aiwatar da umarni da tambayoyin SQL kai tsaye an ƙirƙira su anan. Wani lokaci yana da dacewa don iyakance iyawar aji don aiki tare da bayanan bayanai, alal misali, don samar da ikon karanta bayanai kawai. Don irin waɗannan lokuta IEntityFactoryService akwai kakanni - dubawa IEntityRepositoryFactory, wanda kawai ke bayyana hanya don ƙirƙirar wuraren ajiya.

Don isa ga ma'ajin bayanai kai tsaye, ana amfani da tsarin mai bada sabis. Kowane DBMS da muke amfani da shi a cikin ƙungiyoyinmu yana da nasa aiwatarwa: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

A lokaci guda, ana iya yin rajistar masu samarwa da yawa a cikin aikace-aikacen guda ɗaya a lokaci guda, wanda ke ba da izini, alal misali, a cikin tsarin sabis ɗaya, ba tare da wani farashi don gyara kayan aikin ba, don aiwatar da ƙaura daga mataki-mataki daga. daya DBMS zuwa wani. Tsarin zaɓin haɗin da ake buƙata kuma, don haka, mai ba da sabis na takamaiman nau'in mahalli (wanda aka rubuta taswira zuwa tebur ɗin bayanai) ana aiwatar da shi ta hanyar yin rijistar mahaɗin a cikin ajin BoundedContext (ya ƙunshi hanyar yin rajistar ƙungiyoyin yanki) ko wanda zai gaje shi. ApplicationContext (ya ƙunshi hanyoyin yin rajistar ƙungiyoyin aikace-aikacen, buƙatun kai tsaye da umarni), inda ake karɓar mai gano haɗin haɗin kai daga tsarin a matsayin hujja:

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

Misalin Aikace-aikacen Yanayi:

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

Idan ba a ƙayyade ID na haɗin haɗin ba, to za a yi amfani da haɗin mai suna "default".

Ana aiwatar da taswirar mahaɗan kai tsaye zuwa teburin bayanai ta amfani da daidaitattun kayan aikin NHibernate. Kuna iya amfani da bayanin duka ta fayilolin xml kuma ta cikin azuzuwan. Don dacewa da rubutaccen ma'ajiyar stub a cikin gwaje-gwajen Unit, akwai ɗakin karatu ViennaNET.TestUtils.Orm.

Ana iya samun cikakkun misalan amfani da ViennaNET.Orm.* a nan.

ViennaNET.Saƙon.*

Saitin ɗakunan karatu don aiki tare da jerin gwano.

Don yin aiki tare da layukan layi, an zaɓi hanya iri ɗaya kamar ta DBMS daban-daban, wato, matsakaicin yuwuwar haɗe-haɗen tsarin aiki tare da ɗakin karatu, ba tare da la'akari da manajan layin da aka yi amfani da shi ba. Laburare ViennaNET.Messaging shi ke da alhakin wannan haɗin kai, kuma ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue и ViennaNET.Messaging.KafkaQueue ya ƙunshi aiwatar da adaftar don IBM MQ, RabbitMQ da Kafka, bi da bi.

Lokacin aiki tare da layi, akwai matakai guda biyu: karɓar saƙo da aika shi.

Yi la'akari da karɓa. Akwai zaɓuɓɓuka guda biyu anan: don ci gaba da sauraro da kuma karɓar saƙo ɗaya. Don sauraron jerin gwano akai-akai, dole ne ku fara bayyana nau'in processor ɗin da aka gada IMessageProcessor, wanda zai dauki nauyin sarrafa saƙon mai shigowa. Bayan haka, dole ne a “haɗe shi” zuwa takamaiman jerin gwano; ana yin wannan ta hanyar rajista a ciki IQueueReactorFactory yana nuna mai gano layin layi daga daidaitawa:

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

Misalin fara sauraro:

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

Bayan haka, lokacin da sabis ɗin ya fara kuma aka kira hanyar don fara sauraro, duk saƙonnin da aka ƙayyade za su tafi zuwa ga na'ura mai mahimmanci.

Don karɓar saƙo ɗaya a cikin ƙirar masana'anta IMessagingComponentFactory akwai hanya CreateMessageReceiverwanda zai haifar da mai karɓa yana jiran sako daga jerin gwanon da aka kayyade masa:

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

Don aika sako kana buƙatar amfani da guda ɗaya IMessagingComponentFactory kuma ƙirƙirar mai aika saƙo:

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

Akwai shirye-shiryen shirye-shiryen guda uku don tsara saƙon da keɓance saƙo: rubutu kawai, XML da JSON, amma idan ya cancanta, zaku iya aiwatar da aikace-aikacen kanku cikin sauƙi. IMessageSerializer и IMessageDeserializer.

Mun yi ƙoƙari don adana iyakoki na musamman na kowane manajan jerin gwano, misali. ViennaNET.Messaging.MQSeriesQueue ba ka damar aika ba kawai rubutu, amma kuma byte saƙonnin, kuma ViennaNET.Messaging.RabbitMQQueue yana goyan bayan jerin gwano da kan-da- tashi. Murfin adaftar mu don RabbitMQ shima yana aiwatar da wasu kamannin RPC: muna aika saƙo kuma muna jiran amsa daga jerin gwano na ɗan lokaci na musamman, wanda aka ƙirƙira don saƙon amsawa ɗaya kawai.

a nan misali na yin amfani da layukan da ke da alaƙa na asali.

ViennaNET.CallContext

Muna amfani da layi ba kawai don haɗin kai tsakanin tsarin daban-daban ba, har ma don sadarwa tsakanin ƙananan ayyuka na aikace-aikacen guda ɗaya, misali, a cikin saga. Wannan ya haifar da buƙatar watsawa tare da saƙon irin bayanan taimako kamar shiga mai amfani, mai ganowa don shiga ƙarshen-zuwa-ƙarshe, adireshin IP na tushen da bayanan izini. Don aiwatar da isar da wannan bayanan, mun haɓaka ɗakin karatu ViennaNET.CallContext, wanda ke ba ku damar adana bayanai daga buƙatun shigar da sabis ɗin. A wannan yanayin, yadda aka yi buƙatar, ta hanyar layi ko ta hanyar Http, ba kome ba. Sannan, kafin aika buƙatun mai fita ko saƙo, ana ɗaukar bayanai daga mahallin kuma a sanya su cikin masu kai. Don haka, sabis na gaba yana karɓar bayanan taimako kuma yana sarrafa su ta hanya ɗaya.

Na gode da kulawar ku, muna sa ido ga ra'ayoyin ku da kuma buƙatun ku!

source: www.habr.com

Add a comment