Webbserverprogrammering 1 · område 4
Inlämning 4 – Tjänstelager och tillstånd
All data- och applikationslogik ska lämna komponenterna och flytta in bakom ett gränssnitt. Ingen komponent ska längre veta var datan kommer ifrån. Dessutom bygger du en funktion som håller data över flera sidvisningar, och skriver ned varför du valt de livstider du valt.
- 7 dec Deadline kl 23:59 Repots adress lämnas i itslearning. Prov dagen efter.
Det är avsikten, inte ett misslyckande. Det som bedöms är var koden ligger, inte vad den producerar. Sidorna ska visa samma saker som förut – skillnaden ska bara synas när någon öppnar filerna.
Det gör uppgiften ovanligt otacksam att arbeta med, och det är värt att veta i förväg. Belöningen kommer i område 5: då byter du ut hela din tjänst mot en som läser ur en databas, och rör inte en enda komponent.
1. Uppdraget
Du börjar inte om. Projektet från område 3 är utgångsläget och växer.
Du får med dig sex saker:
- Guiden, som bygger Filmarkivets tjänstelager i sjutton steg med all kod.
- Referensprojektet Filmarkivet, färdigt att köra och läsa.
- Övningsbanken med 22 övningar: 51–56, 57–62, 63–69 och 70–72.
- Sex fel som flyttar sig, med de felmeddelanden du kommer att få och vid vilken tidpunkt de kommer.
- Felhanteringsexemplet från lektion 28: två tjänster som gör samma anrop på olika sätt.
- Lektionerna 23–29. Genomgångarna ligger på 23, 24, 26, 27 och 28.
Facit till övningarna delas ut efter övningspasset, inte före.
Guiden bygger Filmarkivet med komplett kod. Din applikation ska ha samma struktur och annat innehåll. Fyll i högerkolumnen i guidens översättningstabell innan du börjar koda – det är där du bestämmer vad ditt gränssnitt och dina metoder heter.
2. Steg 0 – välj din samling
En av kraven är en samling som överlever sidvisningar. Filmarkivet har en visningslista. Din motsvarighet ska passa din domän:
| Om din domän är… | …kan samlingen vara |
|---|---|
| Recept | Veckans meny, eller inköpslistan |
| Brädspel | Kvällens spelkväll |
| Växter | Att plantera i vår |
| Vandringsleder | Leder att gå i sommar |
| Låtar eller album | Spellistan |
| Böcker | Att läsa härnäst |
Kravet är att den växer över flera sidvisningar och är tom för en annan besökare. Två saker som låter enkla och som är själva examinationen: det första kräver att du lagrar den någonstans, det andra att du lagrar den på rätt ställe.
Kryssen nedan sparas i din webbläsare, så du kan bocka av allteftersom.
3. Ska-krav — nivå E
Skillnaden mot C är inte fler tjänster. Den är att lagren är rena: det går att säga om en rad kod hör hemma i komponenten eller i tjänsten, och den ligger rätt.
4. Bör-krav — nivå C, utöver E
5. Utmaning — nivå A, utöver C
6. Så bedöms den
Den här uppgiften prövar kursens tyngsta betygskriterium:
eleven separerar presentationslagret från övrig logik
På E ska det vara gjort "i någon utsträckning", på C "tydligt", på A "väl". Det är precis vad ett tjänstelager är, och det är därför området ligger före databasen och inte efter.
Jag läser koden och kör projektet. Tre saker väger tyngst:
- Att beroendet går mot gränssnittet. Jag söker på din implementations klassnamn. Dyker det upp i en komponent är lagren inte separerade, hur snyggt det än ser ut.
- Att komponenterna slutat räkna. Jag öppnar de komponenter som visade uträkningar i område 3. Ligger uträkningen kvar är kravet inte uppfyllt.
- Att du kan motivera livstiden. Texten i
README.mdär inte en formalitet – den är det enda stället där jag ser om valet var ett val eller en gissning.
"Jag valde scoped, vilket betyder ett objekt per förfrågan." Det är en definition. Den säger vad ordet betyder, inte varför du valde det.
"Jag valde scoped för att tjänsten läser besökarens session. En singleton hade delats av alla besökare samtidigt, och då hade min inköpslista visat allas varor på en gång." Det är en motivering. Två meningar räcker, men de ska innehålla ett för att och ett annars.
7. Inlämning
- Kontrollera att projektet startar och att alla sidor svarar.
- Sök i projektet på din implementations klassnamn. Två träffar är rätt: klassens egen fil och registreringsraden.
- Öppna sajten i ett privat fönster och kontrollera att samlingen är tom.
- Skriv livstidsmotiveringen och texten om tillstånd i
README.md. - Gå igenom kravlistan för den nivå du siktar på.
git add .,git commit -m "…",git push- Öppna ditt repo på github.com och se att filerna finns där.
- Klistra in repots adress i inlämningsrutan i itslearning.
Deadline är måndag 7 december kl 23:59. Provet är tisdag 8 december och prövar samma innehåll – att göra klart uppgiften är den bästa provförberedelsen som finns.
8. Vanliga misstag
Det här är det som gör att uppgiften underkänns i onödan.
| Misstag | Vad som händer | Undvik det så här |
|---|---|---|
| Tjänst utan gränssnitt | Fungerar, men missar hela poängen. Underkänt krav | IDittService först, klassen sedan |
| Komponenten injicerar klassen i stället för gränssnittet | Lagren är inte separerade | @inject IDittService, aldrig @inject DittService |
| Gamla datafilen ligger kvar | En sida smyger tillbaka till den | Radera filen. Bygget blir kontrollen |
foreach som filtrerar i OnInitializedAsync | Datalogik i komponenten. Sänker på C | Flytta urvalet till tjänsten |
| Samlingen registrerad som singleton | Alla besökare delar samma lista | AddScoped. Kontrollera i privat fönster |
AddSession utan AddDistributedMemoryCache | Servern startar inte alls | Lägg till raden före |
app.UseSession() glömd | Sidan svarar 500: Session has not been configured | Lägg till raden bland app.Use-raderna |
<AntiforgeryToken /> glömd | Formuläret svarar 400 | Lägg den innanför <form> |
@onclick på knappen | Ingenting händer, inget felmeddelande | <form method="post"> med @onsubmit |
| Injektionsnamnet samma som filnamnet | CS0542 | Döp om injektionen |
Livstidsmotivering som säger vad scoped betyder | Är en definition, inte en motivering | Skriv varför just den, och vad som gått fel annars |
| Allt committat sista kvällen | Historiken visar inte arbetet | Committa efter varje pass |