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.
Lektion 24 var områdets tyngsta genomgång. Så här tar du igen den, räkna med drygt tre timmar:
- 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.
- Läs steg 2 till 7 och skriv av koden. Det
är genomgången i sin helhet: gränssnittet, implementationen, registreringen
och
@injecti tre komponenter. - 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.
- 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/.
| Vad | Var | Vad som händer om den glöms |
|---|---|---|
| Gränssnittet | Services/Ovningar/IOvning51.cs | Bygget går igenom, men du har ingen abstraktion – bara en klass |
| Implementationen | Services/Ovningar/Ovning51.cs | CS0535 vid bygget om den inte håller löftet |
| Registreringen | En rad i Program.cs | Bygget 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:
Services/Ovningar/IOvning51.csmed en metodstring Halsa(string namn).Services/Ovningar/Ovning51.cssom uppfyller gränssnittet och svarar"Hej, Anna!"för"Anna".- En rad i
Program.cssom registrerar den somAddScoped.
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.
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.
Ö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.
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.