ViennaNET: komek pirtûkxane ji bo paşîn. Beş 2

Civata pêşdebiran a Raiffeisenbank .NET bi kurtî vekolîna naveroka ViennaNET didomîne. Li ser çawa û çima em gihîştin vê yekê, hûn dikarin beşa yekem bixwînin.

Di vê gotarê de, em ê di pirtûkxaneyên ku hêj nehatine hesibandin re derbas bibin ji bo xebata bi danûstendinên belavbûyî, rêz û databasên ku dikarin di depoya meya GitHub de werin dîtin (çavkanî li vir in), û pakêtên Nuget li vir.

ViennaNET: komek pirtûkxane ji bo paşîn. Beş 2

ViyanaNET.Sagas

Dema ku projeyek berbi DDD û mîmariya mîkroxizmetê vedike, wê hingê gava ku mantiqa karsaziyê li ser karûbarên cihêreng tê belav kirin, pirsgirêkek bi hewcedariya pêkanîna mekanîzmayek danûstendinê ya dabeşkirî re têkildar derdikeve, ji ber ku gelek senaryo bi gelemperî bandorê li çend domanan dikin. Hûn dikarin bi mekanîzmayên weha bi hûrgulî nas bikin, mînakî, di pirtûka "Nimûneyên Microservices" de, Chris Richardson.

Di projeyên xwe de, me mekanîzmayek hêsan lê bikêrhatî pêk aniye: saga, an bêtir sagayek orkestrasyonê. Esasê wê wiha ye: senaryoyek karsaziyek diyar heye ku tê de hewce ye ku bi rêzdarî di karûbarên cûda de operasyonan pêk bînin, û heke di her gavekê de pirsgirêk derbikevin, pêdivî ye ku ji bo hemî gavên berê, li ku derê ye, prosedûra vegerandinê tê gotin. pêşkêş kirin. Bi vî rengî, di dawiya sagayê de, bêyî serfiraziyê, em di hemî qadan de daneyên domdar distînin.

Pêkanîna me hîn jî di forma xweya bingehîn de pêk tê û bi karanîna ti awayên danûstendinê bi karûbarên din re ne girêdayî ye. Bikaranîna wê ne dijwar e: tenê ji çîna bingehîn a abstrakt SagaBase<T> çêkin, ku T çîna konteksta we ye ku tê de hûn dikarin daneyên destpêkê yên ku ji bo xebata sagayê hewce ne, û her weha hin encamên navîn hilînin. Mînaka çarçoveyê dê di dema darvekirinê de ji hemî gavên derbas bibe. Saga bixwe çînek bêdewlet e, ji ber vê yekê mînak dikare di DI-yê de wekî Singleton were danîn da ku girêdanên pêwîst bistînin.

Nimûne reklam:

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

Nimûne bang:

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

Mînakên tevahî yên pêkanînên cihêreng dikarin werin dîtin vir û di civînê de bi testên.

ViennaNET.Orm.*

Komek pirtûkxane ji bo xebitandina bi databasên cihêreng bi navgîniya Nhibernate. Em bi karanîna Liquibase nêzîkatiya DB-First bikar tînin, ji ber vê yekê tenê fonksiyonek ji bo xebata bi daneyan di databasek amade de heye.

ViennaNET.Orm.Seedwork и ViennaNET.Orm - Meclîsên sereke yên ku bi rêzê ve navgînên bingehîn û pêkanînên wan hene. Ka em bi hûrgulî li naveroka wan binêrin.

virtual IEntityFactoryService û pêkanîna wê EntityFactoryService ji bo xebata bi databasê re xala destpêkê ya sereke ne, ji ber ku Yekîneya Kar, depoyên ji bo xebata bi sazîyên taybetî re, û her weha cîbicîkerên fermanan û pirsên rasterast ên SQL li vir têne afirandin. Carinan hêsan e ku meriv kapasîteyên çînek ji bo xebata bi databasê re sînordar bike, mînakî, peydakirina kapasîteya tenê xwendina daneyan. Ji bo rewşên weha IEntityFactoryService têkiliyek bav-kal heye IEntityRepositoryFactory, ku tenê rêbazek ji bo afirandina depoyan eşkere dike.

Ji bo rasterast gihîştina databasê, mekanîzmaya pêşkêşker tê bikar anîn. Her DBMS-ya ku em di tîmên xwe de bikar tînin pêkanîna xwe heye: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

Di heman demê de, çend pêşkêşvan dikarin di heman demê de di yek serîlêdanê de bêne tomar kirin, ku destûrê dide, mînakî, di çarçoweya yek karûbar de, bêyî lêçûnek ji bo guheztina binesaziyê, koçberiyek gav-gav ji yek DBMS ji ya din. Mekanîzmaya hilbijartina pêwendiya pêwîst û, ji ber vê yekê, pêşkêşkarê ji bo çînek saziyek taybetî (ji bo ku nexşeya tabloyên databasê tê nivîsandin) bi qeydkirina saziyê di çîna BoundedContext de (rêbazek ji bo tomarkirina saziyên domainê vedihewîne) an paşgirê wê tête bicîh kirin. ApplicationContext (rêbazên ji bo qeydkirina saziyên serîlêdanê, daxwaz û fermanên rasterast vedihewîne), ku nasnameya girêdanê ya ji veavakirinê wekî arguman tê pejirandin:

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

Mînak ApplicationContext:

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

Ger nasnameya pêwendiyê neyê diyar kirin, wê hingê pêwendiya bi navê "default" were bikar anîn.

Nexşeya rasterast a saziyan li ser tabloyên databasê bi karanîna amûrên standard NHibernate têne bicîh kirin. Hûn dikarin ravekirinê hem bi pelên xml û hem jî bi dersan bikar bînin. Ji bo nivîsandina hêsan a depoyên stûyê di ceribandinên Unit de, pirtûkxaneyek heye ViennaNET.TestUtils.Orm.

Nimûneyên tevahî yên karanîna ViennaNET.Orm.* dikarin werin dîtin vir.

ViennaNET.Messaging.*

Komek pirtûkxane ji bo xebata bi dorê.

Ji bo xebata bi rêzan re, heman nêzîkatî wekî bi DBMS-yên cihêreng re hate hilbijartin, ango, nêzîkatiya yekbûyî ya herî zêde ya gengaz di warê xebata bi pirtûkxaneyê re, bêyî ku rêvebirê rêzê hatî bikar anîn. Pirtûkxane ViennaNET.Messaging tam berpirsiyarê vê yekbûnê ye, û ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue и ViennaNET.Messaging.KafkaQueue ji bo IBM MQ, RabbitMQ û Kafka, bi rêzê ve pêkanînên adapterê hene.

Dema ku bi rêzan re dixebitin, du pêvajo hene: wergirtina peyamek û şandina wê.

Wergirtinê bifikirin. Li vir 2 vebijark hene: ji bo guhdarîkirina domdar û ji bo wergirtina peyamek yekane. Ji bo ku hûn bi domdarî li dorê guhdarî bikin, divê hûn pêşî çîna pêvajoyê ya ku ji mîras hatî wergirtin diyar bikin IMessageProcessor, ku dê ji bo pêvajoykirina peyama gihîştî berpirsiyar be. Dûv re, divê ew bi rêzek taybetî re "girêdayî" be; ev bi navgîniya qeydkirinê tê kirin IQueueReactorFactory nîşana nasnameya rêzê ya ji veavakirinê:

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

Mînaka destpêkirina guhdarîkirinê:

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

Dûv re, gava ku karûbar dest pê dike û rêbaz tê gotin ku dest bi guhdarîkirinê bike, hemî peyamên ji rêza diyarkirî dê biçin pêvajoya têkildar.

Ji bo wergirtina peyamek yekane di navgîniya kargehê de IMessagingComponentFactory rêbazek heye CreateMessageReceiverku dê wergirek li benda peyamek ji rêza ku jê re hatî destnîşan kirin biafirîne:

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

Ji bo şandina peyamek divê hûn heman bikar bînin IMessagingComponentFactory û şandina peyamê biafirîne:

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

Sê vebijarkên amade hene ji bo serialîzekirin û jêbirina peyamek: tenê nivîs, XML û JSON, lê heke hewce be, hûn dikarin bi hêsanî pêkanînên navbeynkariya xwe bikin. IMessageSerializer и IMessageDeserializer.

Me hewl da ku kapasîteyên bêhempa yên her rêveberê rêzê biparêzin, mînakî. ViennaNET.Messaging.MQSeriesQueue destûrê dide te ku hûn ne tenê nivîsê, lê di heman demê de peyamên byte jî bişînin, û ViennaNET.Messaging.RabbitMQQueue rêvekirin û li ser-firînê dorê piştgirî dike. Pêça meya adapterê ya ji bo RabbitMQ di heman demê de hin xuyangên RPC-ê jî bicîh tîne: em peyamek dişînin û li benda bersivek ji rêzek demkî ya taybetî, ya ku tenê ji bo yek peyamek bersivê hatî afirandin, dikin.

vir mînakek karanîna dorên bi nuwazeyên girêdana bingehîn.

ViennaNET.CallContext

Em rêzan ne tenê ji bo yekbûna di navbera pergalên cihêreng de, lê di heman demê de ji bo ragihandina di navbera mîkroxizmetên heman serîlêdanê de, mînakî, di nav saga de bikar tînin. Vê yekê rê li ber hewcedariya şandina digel peyamê daneyên alîkar ên wekî têketina bikarhêner, nasnameya daxwaznameyê ji bo têketina dawiya-bi-dawî, navnîşana IP-ya çavkaniyê û daneyên destûrnameyê veguhezand. Ji bo bicihanîna şandina van daneyan, me pirtûkxaneyek pêş xist ViennaNET.CallContext, ku destûrê dide te ku hûn daneyên ji daxwazek ku dikeve karûbarê hilînin. Di vê rewşê de, daxwaz çawa hate kirin, bi rêzek an bi riya Http, ne girîng e. Dûv re, berî şandina daxwaz an peyama derketinê, dane ji çarçoveyê têne girtin û di serî de têne danîn. Ji ber vê yekê, karûbarê paşîn daneyên alîkar distîne û bi heman rengî rêve dibe.

Spas ji bo baldariya we, em li benda şîrove û daxwazên we ne!

Source: www.habr.com

Add a comment