← Område 4 Övning 51–56 · Gränssnitt och injektion Avprickning

Webbserverprogrammering 1 · område 4 · lektion 24

Gränssnitt, implementation och injektion

Sex övningar om kedjan från löfte till renderad sida. Det är samma sex steg varje gång, och när de sitter i fingrarna är resten av området variationer på dem.

Missade du passet?

Lektion 24 var områdets tyngsta genomgång. Så här tar du igen den, räkna med drygt tre timmar:

  1. Läs guidens steg 1 först. Det innehåller ingen ny kod och går ändå inte att hoppa över – det är där området får sitt skäl.
  2. Läs steg 2 till 7 och skriv av koden. Det är genomgången i sin helhet: gränssnittet, implementationen, registreringen och @inject i tre komponenter.
  3. Gör samma sak i ditt eget projekt innan du går vidare. Övningarna nedan tränar delarna, men det är din egen tjänst som lämnas in.
  4. Lös övning 51 till 56, i ordning.

Ha terminalen där dotnet run körs synlig bredvid webbläsaren. Halva det här området syns bara där.

Varje tjänst behöver tre saker

Tjänsterna lägger du i Services/Ovningar/, sidorna i Components/Pages/Ovningar/.

VadVarVad som händer om den glöms
GränssnittetServices/Ovningar/IOvning51.csBygget går igenom, men du har ingen abstraktion – bara en klass
ImplementationenServices/Ovningar/Ovning51.csCS0535 vid bygget om den inte håller löftet
RegistreringenEn rad i Program.csBygget går igenom. Sidan svarar 500 när den öppnas

Det tredje är det som glöms, och felet ser ut så här. Läs det en gång ordentligt nu – du kommer att se det igen:

InvalidOperationException: Cannot provide a value for property 'Tjanst'
on type '...'. There is no registered service of type 'IOvning51'.

Meddelandet är ovanligt hjälpsamt: det säger vilket gränssnitt som saknar registrering, och vilken egenskap på vilken sida som frågade.

51. Det första gränssnittet

Lätt · tränar: hela kedjan från gränssnitt till renderad sida

Gör tre saker:

  1. Services/Ovningar/IOvning51.cs med en metod string Halsa(string namn).
  2. Services/Ovningar/Ovning51.cs som uppfyller gränssnittet och svarar "Hej, Anna!" för "Anna".
  3. En rad i Program.cs som registrerar den som AddScoped.

Injicera den i en sida och visa resultatet.

Klart när: sidan visar hälsningen, och sidan nämner inte klassnamnet Ovning51 – bara IOvning51.

52. Felet när löftet inte hålls

Lätt · tränar: CS0535 och vad ett gränssnitt kräver

Lägg till en metod int Antal() i gränssnittet från övning 51. Implementera den inte. Bygg.

Skriv av felmeddelandet. Implementera sedan metoden.

Klart när: du kan säga vad CS0535 betyder, och vad som skiljer det från områdets andra fel.

Ett gränssnitt är ett löfte, inte ett förslag

Skriver du : IOvning51 efter klassnamnet har du lovat att alla metoder i gränssnittet finns. Kompilatorn kontrollerar löftet, och det är därför just det här felet kommer redan vid bygget medan de flesta andra i området kommer senare.

53. Tjänsten som svarar med Task

Lätt · tränar: Task<T>, await, async Task

Gör IOvning53 med Task<string> HamtaAsync(). Implementationen svarar med Task.FromResult("klart").

Anropa den från en sida med await i OnInitializedAsync.

Klart när: texten visas. Ta sedan bort async från livscykelmetoden och läs felet innan du sätter tillbaka det.

54. En lista genom ett gränssnitt

Medel · tränar: Task<List<T>> och rendering av svaret

Gör IOvning54 med Task<List<string>> HamtaNamnAsync(). Implementationen har en hårdkodad lista med fyra namn.

Sidan hämtar listan och renderar den som en <ul>.

Klart när: fyra punkter syns, och sidan innehåller ingen lista med namn i sig.

55. Byt implementation, ändra en rad

Medel · tränar: varför beroendet ska gå mot gränssnittet

Gör en andra klass som uppfyller IOvning54 – till exempel en som svarar med namnen baklänges, eller med helt andra namn.

Byt implementation genom att ändra en enda rad i Program.cs.

Klart när: sidan visar den andra listan, och du inte rört sidan över huvud taget.

Det här är hela områdets poäng, på fem minuter

Övning 55 är den övning som är värd att göra även om du hoppar över alla andra. Den ena raden du ändrade är exakt vad som händer i område 5, när DittService byts mot DittDatabasService och läser ur SQLite i stället.

Kom du på dig själv med att också behöva ändra i sidan? Då pekade sidan mot klassen och inte mot gränssnittet. Det är övning 62.

56. När det inte finns något svar

Svår · tränar: nullbar returtyp genom ett gränssnitt

Gör IOvning56 med Task<string?> HamtaAsync(int id) som svarar med ett namn för id 1–3 och null för allt annat.

Sidan ska visa namnet om det finns och något vettigt om det inte gör det – utan att krascha.

Klart när: /ovningar/56/2 visar ett namn och /ovningar/56/99 visar ditt meddelande. Ingen av dem svarar 500.

Frågetecknet är en del av löftet

Task<string?> och Task<string> är två olika löften. Det första säger till den som anropar: det kan komma tillbaka tomt, hantera det. Det andra säger att det alltid finns ett svar.

Samma tanke återkommer i övning 72, där int? används för att säga vet inte i stället för att ljuga med en nolla.

Avprickning

Kryssen sparas i din webbläsare.

Lösta övningar i det här temat

Övning 51, 55 och 56 är de tre som återkommer direkt i inlämningen: kedjan, bytet och det tomma svaret. Gör du bara tre, gör de tre.