← Område 4 Inlämning 4 · Tjänstelager och tillstånd Vanliga misstag

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.

Applikationen ska se likadan ut när du är klar

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:

Facit till övningarna delas ut efter övningspasset, inte före.

Din domän, inte guidens

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
ReceptVeckans meny, eller inköpslistan
BrädspelKvällens spelkväll
VäxterAtt plantera i vår
VandringslederLeder att gå i sommar
Låtar eller albumSpellistan
BöckerAtt 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:

Vad som skiljer en motivering från en definition

"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

  1. Kontrollera att projektet startar och att alla sidor svarar.
  2. Sök i projektet på din implementations klassnamn. Två träffar är rätt: klassens egen fil och registreringsraden.
  3. Öppna sajten i ett privat fönster och kontrollera att samlingen är tom.
  4. Skriv livstidsmotiveringen och texten om tillstånd i README.md.
  5. Gå igenom kravlistan för den nivå du siktar på.
  6. git add ., git commit -m "…", git push
  7. Öppna ditt repo på github.com och se att filerna finns där.
  8. 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.

MisstagVad som händerUndvik det så här
Tjänst utan gränssnittFungerar, men missar hela poängen. Underkänt kravIDittService först, klassen sedan
Komponenten injicerar klassen i stället för gränssnittetLagren är inte separerade@inject IDittService, aldrig @inject DittService
Gamla datafilen ligger kvarEn sida smyger tillbaka till denRadera filen. Bygget blir kontrollen
foreach som filtrerar i OnInitializedAsyncDatalogik i komponenten. Sänker på CFlytta urvalet till tjänsten
Samlingen registrerad som singletonAlla besökare delar samma listaAddScoped. Kontrollera i privat fönster
AddSession utan AddDistributedMemoryCacheServern startar inte allsLägg till raden före
app.UseSession() glömdSidan svarar 500: Session has not been configuredLägg till raden bland app.Use-raderna
<AntiforgeryToken /> glömdFormuläret svarar 400Lägg den innanför <form>
@onclick på knappenIngenting händer, inget felmeddelande<form method="post"> med @onsubmit
Injektionsnamnet samma som filnamnetCS0542Döp om injektionen
Livstidsmotivering som säger vad scoped betyderÄr en definition, inte en motiveringSkriv varför just den, och vad som gått fel annars
Allt committat sista kvällenHistoriken visar inte arbetetCommitta efter varje pass