C# og .NET
C#-grunnlaget og .NET-økosystemet behandlet sammen, fra konsollprogram til fullstack-app.
C#-grunnlag
Variabler og datatyper
SenereHva: int, string, bool, double og typesikkerhet.
Hvorfor: Grunnleggende byggeklosser i alt C#-kode.
Bør kunne: Velge riktig type for riktig data.
If/else
SenereHva: Betinget kjøring av kode.
Hvorfor: Kjernen i all forgrening i programlogikk.
Bør kunne: Skrive lesbare betingelser uten dyp nesting.
Løkker
SenereHva: for, foreach, while.
Hvorfor: Nødvendig for å behandle samlinger og gjentakende logikk.
Bør kunne: Velge riktig løkketype for situasjonen.
Metoder
SenereHva: Gjenbrukbare kodeblokker med parametere og returverdi.
Hvorfor: Grunnlaget for å strukturere logikk.
Bør kunne: Skrive små metoder med ett tydelig ansvar.
Klasser
SenereHva: Definisjoner av objekter med tilstand og oppførsel.
Hvorfor: C# er grunnleggende objektorientert.
Bør kunne: Modellere domenet ditt som klasser med riktig innkapsling.
Objekter
SenereHva: Instanser av klasser.
Hvorfor: Slik data og logikk faktisk brukes i kjørende kode.
Bør kunne: Forstå forskjellen på referanse- og verditype.
Interfaces
SenereHva: Kontrakter som klasser kan implementere.
Hvorfor: Muliggjør løs kobling og testbarhet.
Bør kunne: Programmere mot interfaces, ikke konkrete klasser.
Arv
SenereHva: Gjenbruk og spesialisering av klasser.
Hvorfor: Reduserer duplisering mellom relaterte typer.
Bør kunne: Vite når arv passer bedre enn komposisjon.
Generics
SenereHva: Typeparametrisert kode som fungerer på tvers av typer.
Hvorfor: Gir typesikkerhet uten å duplisere logikk per type.
Bør kunne: Skrive egne generiske metoder og klasser.
LINQ
SenereHva: Spørrespråk integrert i C# for samlinger og data.
Hvorfor: Gjør datatransformasjon kortfattet og lesbar.
Bør kunne: Bruke Where, Select og GroupBy fremfor manuelle løkker.
Async/await
SenereHva: Asynkron programmering i C#.
Hvorfor: Nødvendig for skalerbare I/O-tunge applikasjoner.
Bør kunne: Skrive async-kode uten å blokkere tråder unødvendig.
Exception handling
SenereHva: try/catch/finally og egne unntakstyper.
Hvorfor: Forutsigbar håndtering av feilsituasjoner.
Bør kunne: Fange spesifikke unntak, ikke generiske Exception overalt.
Nullable types
SenereHva: Eksplisitt håndtering av verdier som kan mangle.
Hvorfor: Reduserer NullReferenceException i produksjon.
Bør kunne: Bruke nullable reference types bevisst, ikke undertrykke advarsler.
.NET
.NET SDK
SenereHva: Verktøysettet for å bygge og kjøre .NET-applikasjoner.
Hvorfor: Forutsetning for alt .NET-arbeid.
Bør kunne: Bruke dotnet CLI til å opprette og kjøre prosjekter.
Prosjektstruktur
SenereHva: Standard mappeoppsett for .NET-løsninger.
Hvorfor: Gjenkjennelig struktur gjør prosjekter lettere å navigere.
Bør kunne: Organisere løsninger med tydelig lagdeling.
NuGet
SenereHva: Pakkebehandleren for .NET.
Hvorfor: Slik du henter inn eksterne biblioteker.
Bør kunne: Administrere avhengigheter og versjoner bevisst.
Dependency injection
SenereHva: Innebygd IoC-container i .NET.
Hvorfor: Standardmåten å koble sammen tjenester løst i ASP.NET Core.
Bør kunne: Registrere og injisere tjenester med riktig levetid.
Configuration
SenereHva: appsettings.json, miljøvariabler og Options-mønsteret.
Hvorfor: Skiller konfigurasjon fra kode per miljø.
Bør kunne: Bruke strongly-typed configuration fremfor rå strenger.
Logging
SenereHva: Innebygd logging-abstraksjon i .NET.
Hvorfor: Nødvendig for feilsøking i produksjon.
Bør kunne: Logge med riktig LogLevel og strukturerte data.
Testing
SenereHva: Enhets- og integrasjonstesting med xUnit eller NUnit.
Hvorfor: Gir trygghet ved endringer i forretningslogikk.
Bør kunne: Skrive tester for kjernelogikk og API-endepunkter.
Entity Framework Core
SenereHva: ORM for .NET.
Hvorfor: Standardverktøyet for databasetilgang i .NET-økosystemet.
Bør kunne: Modellere entiteter, relasjoner og migrasjoner.
ASP.NET Core
SenereHva: Rammeverket for web-API-er og webapplikasjoner i .NET.
Hvorfor: Kjernen i backend-utvikling med C#.
Bør kunne: Bygge og strukturere web-API-er idiomatisk.
Minimal APIs
SenereHva: Lettvektig måte å definere endepunkter uten controllers.
Hvorfor: Raskt å komme i gang med for mindre API-er.
Bør kunne: Vite når Minimal API er nok, og når controllers passer bedre.
Controllers
SenereHva: Klassebasert organisering av endepunkter.
Hvorfor: Bedre struktur for større API-er med mye logikk.
Bør kunne: Organisere controllers etter ressurs.
Middleware
SenereHva: Pipeline av komponenter som behandler hver forespørsel.
Hvorfor: Håndterer tverrgående bekymringer som logging og feilhåndtering.
Bør kunne: Skrive egen middleware når innebygde ikke strekker til.
Authentication
SenereHva: Bekreftelse av brukeridentitet i ASP.NET Core.
Hvorfor: Forutsetning for beskyttede endepunkter.
Bør kunne: Sette opp JWT-basert autentisering.
Authorization
SenereHva: Rolle- og policy-basert tilgangskontroll.
Hvorfor: Bestemmer hva autentiserte brukere får gjøre.
Bør kunne: Bruke [Authorize]-attributter og policies riktig.
Swagger/OpenAPI
SenereHva: Automatisk generert API-dokumentasjon.
Hvorfor: Gjør API-et utforskbart og testbart uten ekstern dokumentasjon.
Bør kunne: Holde Swagger-annotasjoner oppdatert med faktisk oppførsel.
Prosjektstige
Konsollkalkulator
Grunnleggende syntaks, metoder og kontrollflyt uten UI eller I/O-kompleksitet.
Budsjettprogram i konsollen
Enkel datamodellering, samlinger og LINQ for beregninger.
SQLite-app
Første møte med persistens og enkel databasetilgang.
REST API
Bygg et første API med Minimal APIs eller controllers.
ASP.NET Core Web API
Strukturert API med lagdeling, DI og konfigurasjon.
API med PostgreSQL
Entity Framework Core mot en ekte relasjonsdatabase.
Autentisering
JWT-basert innlogging og beskyttede endepunkter.
Fullstack-app med Next.js-frontend
Koble et ASP.NET Core-API til en Next.js-frontend i produksjon.
Anbefalt prosjektstruktur for et ASP.NET Core API
MinApp/
├── src/
│ ├── MinApp.Api/
│ │ ├── Controllers/
│ │ ├── Middleware/
│ │ ├── Program.cs
│ │ └── appsettings.json
│ ├── MinApp.Application/
│ │ ├── Services/
│ │ └── DTOs/
│ ├── MinApp.Domain/
│ │ └── Entities/
│ └── MinApp.Infrastructure/
│ ├── Data/
│ └── Repositories/
└── tests/
└── MinApp.Tests/