Blazor WebAssembly tarjoaa monipuolisen ympäristön verkkosovellusten komponenttien luomiseen ja testaamiseen. Yksi tämän teknologian tärkeimmistä piirteistä on komponenttien mahdollisuus käyttää C#-koodia ja Razor-syntaksia HTML-markupin rinnalla, mikä tekee web-sovellusten kehittämisestä joustavaa ja tehokasta. Tässä osassa tarkastelemme, kuinka luoda ja testata Blazor-komponentteja, kuten modal-ikkunoita, alertteja ja vuorovaikutteisia elementtejä.

Ensimmäinen askel Blazor-komponentin luomisessa on määrittää sen rakenne ja käyttäytyminen. Käyttämällä Razor-komponentteja, kuten DialogBox.razor, voidaan luoda vuorovaikutteisia elementtejä, kuten pop-up-ikkunoita, jotka reagoivat käyttäjän toimintaan. Esimerkiksi, kun käyttäjä painaa painiketta, avautuu dialogi, jossa on valmiiksi määritetyt vaihtoehdot, kuten "OK" ja "Peruuta". Näiden valintojen koodikäsittely voidaan määritellä tapahtumankäsittelijöillä, jotka vastaavat painikkeiden toiminnasta.

Komponenttien luominen Blazorissa vaatii tarkkaa huomiota siihen, miten tapahtumia käsitellään ja mitä arvoja ne voivat palauttaa. Esimerkiksi, kun käyttäjä painaa "OK"-painiketta, voidaan tapahtumankäsittelijän avulla kirjoittaa tietoja selaimen konsoliin, mikä on hyödyllistä sovelluksen toiminnan tarkkailussa ja virheenkorjauksessa. Tämä prosessi tarjoaa käyttäjälle välittömän vuorovaikutuksen ja selkeän palautteen siitä, miten sovellus reagoi käyttäjän valintoihin.

Toinen tärkeä osa Blazor-komponentteja on niiden mukautettavuus. Käyttämällä @Parameter-attribuuttia voidaan luoda komponentteja, joihin voidaan syöttää ulkoisia arvoja, kuten tekstisisältöjä tai tapahtumankäsittelijöitä. Tämä mahdollistaa komponentin joustavan käytön eri konteksteissa, esimerkiksi muokkaamalla painikkeiden tekstejä tai määrittämällä, mitä tapahtuu, kun tiettyjä elementtejä klikataan. Erityisesti dialogeissa ja alert-komponenteissa on tärkeää, että käyttäjä voi helposti muokata viestejä ja valintoja ilman, että komponentin ydinrakenne muuttuu.

Komponenttien toiminnallisuuden ja visuaalisen ulkoasun yhdistäminen on mahdollista Bootstrapin avulla. Bootstrap tarjoaa laajan valikoiman tyyliluokkia, jotka voivat määrittää komponenttien ulkoasun ja reaktiot. Esimerkiksi btn-close-luokka mahdollistaa modal-ikkunan sulkemisen visuaalisesti houkuttelevalla tavalla, samalla kun tapahtumat, kuten painikkeen klikkaukset, voidaan liittää koodiin ja seurata niiden vaikutuksia sovelluksen toiminnassa.

Kun komponentit on rakennettu ja testattu paikallisesti, seuraava askel on niiden integroiminen suurempaan sovellukseen ja niiden käyttäytymisen tarkastelu eri ympäristöissä. Tämä voi sisältää selainten kehitystyökalujen käyttöä, kuten konsolin seuraamista, jotta voidaan nähdä, miten komponentit reagoivat eri käyttäjän syötteisiin ja missä kohtaa koodissa saattaa esiintyä ongelmia. Komponenttien käytettävyyttä on myös testattava erityisesti esteettömyyden kannalta, sillä Blazor-komponentit voivat vaikuttaa siihen, miten sivu navigoituu ja miten sisältö ilmoitetaan ruudunlukuohjelmalle.

Lopuksi, komponenttien integrointi ja testaus Blazor WebAssemblyssa ei rajoitu pelkästään visuaalisiin elementteihin, vaan myös taustajärjestelmien, kuten tietokantojen tai API-pyyntöjen, käsittelyyn. Esimerkiksi, jos sovelluksessa on toiminto, joka simuloi tietokannan poistamista, on tärkeää näyttää käyttäjälle edistymispalkki, joka informoi häntä prosessin etenemisestä. Tämä parantaa käyttökokemusta ja tekee sovelluksesta käyttäjäystävällisemmän.

Lisäksi, kun kehitetään Blazor-komponentteja, on syytä kiinnittää huomiota siihen, miten ne toimivat eri laitteilla ja selaimilla. Vaikka Blazor WebAssembly on tehokas työkalu, sen toiminta voi vaihdella riippuen selaimen tuesta ja laitteen resursseista. Tämän vuoksi on suositeltavaa testata komponentteja useissa ympäristöissä ja varmistaa niiden toimivuus eri kokoisilla näytöillä sekä erilaisilla laitteilla.

Miten hallita perhesuhteiden tietomalleja SQL Serverissä käyttäen Entity Frameworkia?

Kun käsitellään perhesuhteiden tietomalleja, erityisesti olioiden perintöstruktuureja, on tärkeää ymmärtää, kuinka relaatiotietokantojen taulujen rakenne vaikuttaa sovellusten suorituskykyyn ja tietojen hallintaan. SQL Serverin kanssa työskentelevät sovelluskehittäjät joutuvat usein valitsemaan sopivan tietokannan rakenteen erityyppisille oliohierarkioille. Yksi tapa ratkaista tämä on käyttää erilaisten tietomallinnusstrategioiden, kuten TPH, TPT ja TPC, tarjoamia etuja ja haittoja.

Table-per-Hierarchy (TPH) -strategia

Table-per-Hierarchy (TPH) on yksinkertaisin ja usein käytetyin lähestymistapa perhesuhteiden mallintamiseen. TPH-strategiassa koko perhesuhteen tiedot tallennetaan yhteen tauluun, ja taulun eri rivit sisältävät kenttiä, jotka voivat vaihdella eri perheenjäsenille. Esimerkiksi Person-luokasta periytyvät Student ja Employee voivat jakaa saman taulun, mutta niillä on omat sarakkeensa, kuten Subject opiskelijoille ja HireDate työntekijöille. TPH-strategian etu on yksinkertaisuus ja suoritusteho, koska kyselyt koskevat vain yhtä taulua, eikä jouduta tekemään monimutkaisempia yhdistämisiä useiden taulujen välillä.

Kuitenkin, TPH-strategian haasteena on se, että taulun rakenne voi kasvaa monimutkaiseksi, jos perhesuhteet sisältävät suuren määrän perityviä tyyppejä tai jos eri tyypeillä on paljon erilaisia ominaisuuksia. Tämä voi vaikuttaa negatiivisesti suorituskykyyn, erityisesti jos kyselyissä haetaan vain tiettyjä alatyyppejä, jolloin joudutaan käsittelemään tarpeettomia tietoja yhdestä taulusta.

Table-per-Type (TPT) -strategia

TPT-strategiassa luodaan erilliset taulut kullekin luokalle, ja ne yhdistetään toisiinsa ulkoisten avainten avulla. TPT on hyödyllinen silloin, kun tietorakenne on hyvin normalisoitu ja eri perheenjäsenet tarvitsevat erilliset taulut omille ominaisuuksilleen. Esimerkiksi Student- ja Employee-luokat saavat omat taulunsa, mutta ne voivat silti viitata yhteiseen Person-tauluun ulkoisen avaimen kautta.

TPT-strategian suurin haitta on kuitenkin sen suorituskyky, sillä tietojen yhdistäminen useista tauluista lisää kyselyjen monimutkaisuutta ja voi hidastaa niitä. Tämä on erityisen merkittävää silloin, kun joudutaan tekemään yhdistämisiä suuren määrän rivien välillä. TPT on yleensä huono valinta silloin, kun taulurakenne ei ole jo normalisoitu, ja se voi vähentää kokonaiskäytettävyyttä ja suorituskykyä.

Table-per-Concrete-Type (TPC) -strategia

Table-per-Concrete-Type (TPC) on toinen vaihtoehto, joka tarjoaa erilliset taulut jokaiselle konkreettiselle tyypille. Toisin kuin TPT, TPC ei tarvitse erillistä "perusluokkaa" (kuten Person-taulu), vaan jokainen tyyppi tallennetaan omassa taulussaan omilla sarakkeillaan. Esimerkiksi Student- ja Employee-luokat olisivat omissa tauluissaan, ja kummassakin taulussa olisi vain sen tyyppisiä ominaisuuksia, jotka koskevat kyseistä luokkaa.

TPC-strategian etu on suorituskyvyssä: kun kyselyt koskevat vain yhtä konkreettista tyyppiä, ei tarvitse tehdä yhdistämisiä muiden taulujen kanssa. Tämä voi parantaa suorituskykyä erityisesti suurissa tietomalleissa, joissa on monia konkreettisia tyyppejä ja paljon erikoistuneita kenttiä. Kuitenkin TPC voi olla huono valinta silloin, kun perhesuhteet ovat monimutkaisempia ja tiedonhallinta vaatii monimutkaisempia yhdistämisiä useista tauluista.

Perhesuhteen rakenteiden määrittäminen Entity Frameworkissä

Entity Frameworkin (EF) avulla voidaan määritellä perhesuhteiden mallinnusstrategiat helposti. Ensinnäkin kaikki perheen jäsenet täytyy sisällyttää malliin DbSet-objekteina. Jos käytetään TPH-strategiaa, ei tarvitse tehdä mitään erityistä, koska se on oletusarvo. Jos taas halutaan käyttää TPT- tai TPC-strategioita, voidaan määritellä nämä strategiat OnModelCreating-metodissa.

Esimerkiksi TPC-strategian käyttäminen vaatii taulukon jakamista eri tauluilla, joten on määriteltävä, että henkilöt, opiskelijat ja työntekijät saavat omat taulunsa, ja käytettävä yhteistä sekvenssiä tunnusten luomiseen. TPC-strategia vaatii myös, että määritellään se sekvenssi, joka jakaa tunnukset (Id) näiden taulujen kesken, jotta ei synny päällekkäisiä arvoja.

Esimerkki käytännössä

Oletetaan, että haluamme mallintaa opiskelijan ja työntekijän suhteet tietokannassa. Tämä voidaan tehdä luomalla kolme luokkaa: Person (abstrakti perusluokka), Student ja Employee. Näiden luokkien pohjalta Entity Framework luo tarvittavat taulut tietokantaan ja määrittelee niiden suhteet toisiinsa. Esimerkiksi, jos käytetään TPC-strategiaa, molemmat Student- ja Employee-taulut voivat jakaa saman sekvenssin tunnuksille, mutta niillä on omat erilliset sarakkeet (Subject ja HireDate).

Kun tietokannan rakenne on määritetty ja luokkia on täydennetty, voidaan käyttää EF:n tarjoamia työkaluja tietokannan luomiseen ja sen käyttäjäkyselyjen suorittamiseen. Tällöin voidaan luoda ja käyttää SQL-skriptit, jotka auttavat suorittamaan automaattisesti tarvittavat tietokantatoiminnot, kuten taulujen luomisen ja tietojen täyttämisen.

Tämä malli auttaa kehittäjiä luomaan skaalautuvia ja suorituskykyisiä sovelluksia, joissa tiedot on organisoitu tehokkaasti ja helposti hallittavissa, erityisesti silloin, kun tarvitaan monimutkaisempia perhesuhteiden hallintaa.

Miten rakentaa striimausalusta ja testata asiakasohjelma

Striimauspalveluiden kehittäminen ja käyttö on kehittynyt huimasti viime vuosina. Erityisesti pilvipohjaisten alustojen avulla striimausteknologiat ovat tulleet entistä saavutettavammiksi ja monipuolisemmiksi. Striimausalustan rakentaminen ja asiakasohjelman kehittäminen ovat keskeisiä elementtejä, kun halutaan hyödyntää tätä teknologiaa käytännön sovelluksissa. Tämän luvun tavoitteena on käydä läpi, kuinka kehittää yksinkertainen .NET-konsoliohjelma, joka toimii striimauspalvelun asiakkaana, sekä testata tätä järjestelmää tehokkaasti.

Striimauspalvelun rakentamisessa tärkeimpiä komponentteja ovat palvelimen ja asiakkaan välinen kommunikaatio, tiedonsiirtonopeus ja virheenkäsittely. Kehittäjän on pystyttävä varmistamaan, että kaikki osat toimivat saumattomasti yhdessä, jotta saavutetaan haluttu suorituskyky ja vakaus. Striimausalustan ja asiakasohjelman kehittäminen ei ole vain ohjelmointityötä, vaan myös suunnittelua ja optimointia.

Ensimmäinen askel striimausalustan rakentamisessa on valita oikea teknologia. Tässä esimerkissä käytämme .NET-ympäristöä, joka tarjoaa laajan työkalupakin striimausteknologioiden hyödyntämiseen. Striimausalustan luomisessa keskeistä on palvelimen ja asiakasohjelman välinen tiedonsiirto. Kun tiedonsiirto toteutetaan tehokkaasti, pystytään varmistamaan striimin sujuva toisto loppukäyttäjälle ilman merkittäviä viiveitä tai katkoja.

Asiakasohjelman rakentaminen .NET:illä on yksinkertaista ja tehokasta. Konsoliohjelma toimii tässä esimerkissä asiakassovelluksena, joka vastaanottaa ja toistaa striimattua dataa. Käyttämällä .NET:in tarjoamia kirjastoja, kuten HttpClient ja WebClient, voidaan luoda yksinkertainen ohjelma, joka kommunikoi striimauspalvelun kanssa ja käsittelee saapuvan datan oikein. On kuitenkin tärkeää varmistaa, että asiakasohjelma kykenee käsittelemään mahdolliset virheet ja poikkeustilanteet.

Striimauspalvelun testaus on elintärkeää, sillä vain huolellinen testaus takaa sen, että palvelu on luotettava ja tehokas. Testaaminen voi sisältää useita vaiheita: yksittäisten komponenttien testaaminen, kuormitustestaus ja virheenkäsittelyn tarkistaminen. On tärkeää käyttää testitapauksia, joissa simuloidaan tavallisia käyttötilanteita, kuten suuret käyttäjämäärät ja verkon katkokset. Tällöin voidaan varmistaa, että palvelu toimii myös kuormitettuna.

Kun asiakasohjelma ja palvelu on testattu, seuraava askel on suorittaa kokonaistestaus, joka kattaa sekä palvelimen että asiakassovelluksen toiminnan. Tällöin tarkastellaan esimerkiksi latenssia, tiedonsiirtonopeuksia ja virheiden käsittelyä. Kokonaistestaus auttaa tunnistamaan mahdolliset pullonkaulat ja optimointitarpeet. Tällöin voidaan myös testata skaalautuvuutta, joka on oleellinen osa striimausalustan rakennetta. Mikäli asiakasohjelma toimii virheettömästi eri tilanteissa, voidaan olla varmoja siitä, että palvelu täyttää käyttövaatimukset.

On tärkeää ymmärtää, että striimausalustan ja asiakasohjelman kehittäminen ei ole vain tekninen tehtävä, vaan siihen liittyy myös monia suunnittelullisia ja käytettävyysnäkökulmia. Käytettävyyttä on testattava eri laitteilla ja verkko-olosuhteissa, sillä loppukäyttäjän kokemus on tärkeässä roolissa. Erityisesti mobiililaitteilla ja heikommilla verkkoyhteyksillä toimivien sovellusten kehittäminen vaatii erityistä huomiota. Striimauspalvelun kehittäminen ei pääty pelkkään koodin kirjoittamiseen; se on jatkuvaa optimointia ja virheiden etsimistä, jotta saavutetaan mahdollisimman hyvä lopputulos.

Testaaminen on keskeinen osa prosessia. Ensimmäisissä vaiheissa on tärkeää käydä läpi yksittäiset komponentit ja niiden toiminta erikseen. Tämä vaihe varmistaa, että kaikki osat toimivat odotetulla tavalla ennen kuin ne yhdistetään kokonaisuudeksi. Koko järjestelmän testaus auttaa taas varmistamaan, että kaikki toimii saumattomasti ja että järjestelmä pystyy käsittelemään suuria määriä dataa ja käyttäjiä.

Striimausalustojen kehittämisessä on tärkeää huomioida myös tulevaisuuden tarpeet, kuten laajennettavuus ja skaalautuvuus. Striimausalustan on pystyttävä käsittelemään kasvavia käyttäjämääriä ilman, että se heikentää suorituskykyä. Pilvipalvelut ja modernit ohjelmistokehityksen käytännöt mahdollistavat joustavan skaalautuvuuden, mutta se vaatii jatkuvaa huomiota ja säätöä.

Miten tarkastella ja muokata .NET-sovelluksen kokoonpano- ja metatietoja ajonaikaisesti?

Ohjelman kokoonpanon ja metatietojen tarkastelu ajonaikaisesti avaa mahdollisuuden ymmärtää, mitä tietoja .NET-sovellus sisältää itsestään. Tämä lähestymistapa käyttää reflektiota, joka on tehokas väline ohjelmakoodin tutkimiseen ja muokkaamiseen ajon aikana. Tärkeimpänä lähtökohtana toimii System.Reflection-nimialue, jonka avulla saadaan pääsy ajossa olevan sovelluksen kokoonpanotietoihin.

Ensimmäinen askel on hankkia nykyisen sovelluksen kokoonpano (assembly) metodilla Assembly.GetEntryAssembly(). Tällä saadaan esiin kokoelma metatietoja, kuten täydellinen nimi, sijainti tiedostojärjestelmässä ja ohjelman sisäänmenopiste. Tämän lisäksi voidaan luetella kaikki kokoonpanotasoiset attribuutit ja tarkastella niiden tyyppiä. Tämä prosessi paljastaa automaattisesti lisätyt attribuutit kuten CompilationRelaxationsAttribute, TargetFrameworkAttribute ja AssemblyCompanyAttribute, jotka usein lisätään Roslyn-kääntäjän toimesta ilman erillistä määrittelyä.

Attribuuttien arvoihin pääsee käsiksi kohdentamalla haku tiettyihin attribuuttityyppeihin. Esimerkiksi AssemblyCompanyAttribute ja AssemblyInformationalVersionAttribute voidaan hakea suoraan metodilla GetCustomAttribute<T>(), jolloin saadaan näkyviin yrityksen nimi ja versionumero. Mikäli näitä ei ole asetettu, ne saavat oletusarvot, kuten versionumeroksi 1.0.0 ja yritykseksi kokoonpanon nimen.

Vanhemmissa .NET-versioissa nämä attribuutit määriteltiin suoraan lähdekoodissa assembly-tason attribuutteina. Uudemmassa .NET-ympäristössä tämä lähestymistapa ei kuitenkaan enää toimi Roslyn-kääntäjän automaattisen prosessoinnin vuoksi. Tästä syystä version ja yritystiedot tulee asettaa .csproj-projektitiedostossa <Version>- ja <Company>-elementteihin. Näin tiedot päätyvät kokoonpanon metatietoihin, ja niitä voidaan lukea reflektiolla ajon aikana.

Reflektion mahdollisuudet eivät rajoitu vain sisäänrakennettuihin attribuutteihin. Kehittäjä voi määrittää myös omia attribuutteja, jotka säilyttävät lisätietoa esimerkiksi luokan tai metodin kehittäjistä. Tällöin luodaan uusi luokka, joka perii Attribute-luokan ja määritellään attribuuttien käyttöalue AttributeUsage-attribuutilla. Esimerkiksi CoderAttribute voi tallentaa kehittäjän nimen ja päivämäärän, jolloin hän on viimeksi muokannut koodia. Attribuutin voi liittää luokkiin tai metodeihin, ja sen lukeminen tapahtuu samalla reflektiomekanismilla kuin sisäänrakennettujen attribuuttien kohdalla.

Kun oma attribuutti on luotu ja kiinnitetty esimerkiksi metodiin, voidaan ajonaikaisesti tarkastella koodin historiaa: kuka muokkasi ja milloin. Tämä voidaan toteuttaa hakemalla kaikki tyypit kokoonpanosta, tutkimalla niiden jäseniä, ja lajittelemalla mahdolliset CoderAttribute-attribuutit esimerkiksi viimeisimmän muokkauspäivämäärän mukaan. Tämä tuo koodiin versionhallinnan kaltaisen kerroksen, joka on suoraan näkyvissä reflektiolla.

Ajossa havaittavat tyypit eivät kuitenkaan aina ole kehittäjän lisäämiä. Jotkin tyypit, kuten Program+<>c, ovat kääntäjän automaattisesti luomia apuluokkia, joita käytetään esimerkiksi sulkulausekkeiden ja lambda-funktioiden toteutukseen. Ne tunnistaa CompilerGeneratedAttribute-attribuutista ja niiden nimen sisältämästä merkkijonosta <>. Nämä tyypit voi tarvitta

Miten Implementoida gRPC-mikropalveluja EF Core -mallilla

gRPC (Google Remote Procedure Call) on tehokas ja suorituskykyinen viestintäprotokolla, joka mahdollistaa nopean ja luotettavan tiedonsiirron mikropalvelujen välillä. Sen avulla voidaan kehittää skaalautuvia ja hyvin optimoituja järjestelmiä, joissa palvelut kommunikoivat toistensa kanssa määriteltyjen sopimusten mukaan. Tämä luku käsittelee gRPC-palvelun implementointia ja sen yhdistämistä EF Core -malliin, käyttäen esimerkkinä Northwind-tietokannan integrointia.

gRPC-palvelun lisääminen EF Core -mallille alkaa ensiksi projektin perustamisella ja tietokannan kontekstin tuomisella. Tämä on tärkeää, sillä gRPC käyttää .proto-tiedostoja palveluiden ja viestien määrittelyyn, mutta toisaalta EF Core huolehtii tietokannan yhteyksistä ja ORM-toiminnoista. Näin yhdistämällä molemmat tekniikat saadaan aikaan tehokas ja joustava palvelu, joka kykenee suorittamaan tietokantahakuja ja palauttamaan tietoja gRPC-pyynnöistä.

Tässä esimerkissä luodaan Northwind.Grpc.Service -projektiin palvelu, joka toimii tietokannan kanssa, ja joka lähettää ja vastaanottaa tietoja gRPC:n kautta. Aluksi luodaan uusi .proto-tiedosto, joka määrittelee "Shipper"-palvelun, joka pyytää tietoja tietyn kuljetusyrityksen (shipper) perusteella.

proto
syntax = "proto3"; option csharp_namespace = "Northwind.Grpc.Service"; package shipper; service Shipper { rpc GetShipper (ShipperRequest) returns (ShipperReply); } message ShipperRequest { int32 shipperId = 1; } message ShipperReply { int32 shipperId = 1; string companyName = 2; string phone = 3; }

Tämä tiedosto määrittelee palvelun ja siihen liittyvät viestityypit. ShipperRequest pyytää kuljetusyrityksen ID:tä, ja ShipperReply palauttaa yrityksen tiedot, kuten nimen ja puhelinnumeron. Tämä tiedosto luo pohjan gRPC-palvelulle, ja sen perusteella luodaan vastaavat luokat, joita palvelin käyttää tiedon käsittelyyn.

Seuraavaksi luodaan ShipperService.cs-luokka, jossa määritellään palvelun logiikka. Tähän luokkaan lisätään logiikka tietokannan kyselyjen suorittamiseksi EF Core -kontekstin avulla. Tavoitteena on palauttaa oikeat tiedot kuljetusyrityksistä, jotka vastavat pyydettyä ID:tä.

csharp
public class ShipperService : Shipper.ShipperBase
{ private readonly ILogger _logger; private readonly NorthwindContext db; public ShipperService(ILogger logger, NorthwindContext db) { _logger = logger; this.db = db; } public override async Task<ShipperReply> GetShipper(ShipperRequest request, ServerCallContext context) { var shipper = await db.Shippers.FindAsync(request.ShipperId); if (shipper == null) { return null; } else { return ToShipperReply(shipper); } } private ShipperReply ToShipperReply(ShipperEntity shipper) { return new ShipperReply { ShipperId = shipper.ShipperId, CompanyName = shipper.CompanyName, Phone = shipper.Phone }; } }

Tässä palvelussa käytetään EF Core -kontekstia (NorthwindContext) tietojen hakemiseen tietokannasta. Kun kuljetusyrityksen tiedot on saatu, ne muutetaan .proto-tiedostosta luotuun ShipperReply-viestiin. Tämä erottelu on tärkeää, sillä gRPC:n ja EF Coren tietorakenteet eivät ole suoraan yhteensopivia, ja siksi tarvitaan muunnosprosessia, kuten ToShipperReply-metodi tässä esimerkissä.

Palvelun määrittelyn jälkeen on tärkeää konfiguroida palvelu palvelinpuolella. Program.cs-tiedostossa lisätään tarvittavat palvelut ja varmistetaan, että gRPC-palvelut ovat rekisteröityjä ja kuuntelevat oikeassa osoitteessa.

Kun palvelin on valmis, siirrytään asiakaspuolelle. Northwind.Grpc.Client.Mvc -projektiin kopioidaan shipper.proto-tiedosto ja päivitetään sen nimiavaruus vastaamaan asiakaspuolen projektia. Tämän jälkeen lisätään tarvittavat gRPC-asiakasluokat ja konfiguroidaan ne, jotta ne voivat kommunikoida palvelimen kanssa.

Asiakaspalvelu voidaan konfiguroida seuraavasti:

csharp
builder.Services.AddGrpcClient<Shipper.ShipperClient>("Shipper", options => { options.Address = new Uri("https://localhost:5121"); });

Tässä määritellään, että asiakas käyttää ShipperClient-luokkaa, joka on luotu shipper.proto-tiedoston perusteella, ja että asiakas yhdistää palvelimeen osoitteessa https://localhost:5121.

Kun asiakas on konfiguroitu, voimme luoda HTTP-pyynnön palvelimelle ja käsitellä sen vastauksen. Tämä voidaan tehdä esimerkiksi HomeController.cs-luokassa, jossa otetaan vastaan käyttäjän syötteet, kuten kuljetusyrityksen ID, ja haetaan vastaavat tiedot gRPC-palvelusta.

csharp
public async Task<IActionResult> Index(string name = "Henrietta", int id = 1) { try {
var shipperReply = await shipperClient.GetShipperAsync(new ShipperRequest { ShipperId = id });
ViewData[
"shipper"] = $"Shipper from gRPC service: ID: {shipperReply.ShipperId}, Name: {shipperReply.CompanyName}, Phone: {shipperReply.Phone}"; } catch (Exception ex) { _logger.LogWarning($"Northwind.Grpc.Service is not responding."); ViewData["exception"] = ex.Message; } return View(); }

Tässä esimerkissä luodaan HTTP-pyyntö, jossa asiakas lähettää ShipperRequest-viestin palvelimelle ja odottaa ShipperReply-viestin paluuta. Kun vastaus saapuu, se voidaan esittää käyttäjälle esimerkiksi näkymässä.

Lisäksi on tärkeää huomioida, että gRPC on erityisen tehokas ja nopea protokolla, mutta se edellyttää, että kaikki viestit ja palvelut määritellään tarkasti ja että ne ovat yhteensopivia palvelimen ja asiakkaan välillä. Tämä tarkoittaa, että .proto-tiedostojen hallinta ja generointi on olennainen osa prosessia.