Dit project moet er komen in zowel een Java Spring boot variant als een C# variant. De Java variant zit al in de blog post op minordevops.nl (van der Wal, 2024), dus dit project werkt de C# variant uit.
We hanteren Domain Driven Design (DDD) voor deze simpele opgave als oefening. We houden het nog wel bij een monoliet in plaats van Microservices (Architecture; MSA). Maar als oefening, en met idee dit later te kunnen 'stranglen' naar microservicves, maken we wel een modulaire monoliet. En we hangen een beetje richting 'over engineering' met gebruiken principes van Layered architecture, TDD en Dependency Injection (DI).
Om *branch by abstraction** te laten zien zijn er 3 gebruikes van de priem 'service':
*Deze 'minimal API' is een vrij recent variant al bedoeld voor/gericht op microservices. Meer heb ik hier nu ook niet over gelezen, maar ChatGPT (ChatGPT 2024) gaf me wel wat verwijzingen die ik onderaan toevoeg in een 'Bibliografie', naast een Literatuurlijst. De werken in de biobliografie kun je zelf verder lezen, en dat zal ik ook doen als ik klaar met deze opdracht ;). In de 'Literatuurlijst' plaats ik netjes overal verwijzingen (bij quotes of parafrases) naar hier in de tekst, zoals het hoort bij APA. Dit even ter illustratie van het verschil tussen deze twee (vooruitlopend op week 6 onderzoeksweek in de minor).
Later breiden we dit uit met een database voor persistentie met een 'code first' ORM met migrations (Entity Framework Core in C# of voor Java/Spring boot variant JPA/Hibernate met Flyway voor ook migrations)
In afwezigheid van een echte opdrachtgever zie ik Wikipedia als Business expert. Dit is minder willekeurig dan zelf de termen verzinnen.
De Engels-Amerikaans talige Wikipedia noemt testen voor priemgetallen testen het 'primality checking'.
Aangezien de opdracht in het Nederlands is gebruik ik ook Nederlands, maar gebruik ik wel de uit het Engels afkomstige term 'checken'. Prettige bijkomstigheid is dat nu de xUnit
naamgeving postfix -test
in bestandsnamen anders is, en dat het geen PriemgetalTesterTest wordt, maar PriemgetalCheckerTest
- https://nl.wikipedia.org/wiki/Priemgetal
"The property of being prime is called primality. A simple but slow method of checking the primality of a given number n, called trial division, ..." - https://en.wikipedia.org/wiki/Prime_number
Bron: https://learn.microsoft.com/en-us/ef/core/get-started/overview/first-app?tabs=netcore-cli
De WEB api met Swagger test pagina's kun je makkelijkst runnen uit IDE. Ik gebruikte Rider 2024.2.4.
Maar het kan ook met
cd WebPriemgetal
dotnet run
En dan ga je naar aangegeven URL. Je moet wel /swagger
achtervoegen.
Standaard http://localhost:5062
Of gebruik
curl -X 'POST' \
'http://localhost:5062/isPriem?getal=12' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{}'
De command line kan je runnen met dotnet
cli, mits je die hebt geinstalleerd natuurlijk (en brew
geïnstalleerd hebt).
brew install dotnet@8
brew install --cask dotnet-sdk
En dan run je de applicatie met bijvoorbeeld input 12
om te prime checken met dotnet run 12
:
Als je in de folder zit (PrimeChecker
):
cd ConsolePriemChecker
dotnet run 12
>Is getal 12 een priemgetal? JA
Je kunt lokaal los de SQL server runnen in een container (eerst Docker installeren, op Windows of macOS makkelijkst via Docker Desktop installeren):
Start SQL server in container
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=Your_password123" \
-p 1433:1433 --name sqlserver \
-d mcr.microsoft.com/mssql/server:2022-latest
Op macOS met M1 of M2 processor moet je de --platform linux/amd64
flag toevoegen:
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=Your_password123" \
-p 1433:1433 --name sqlserver \
--platform linux/amd64 \
-d mcr.microsoft.com/mssql/server:2022-latest
Je kunt deze dan benaderen via bijvoorbeeld de Database explorer in Rider (onder View
-> Tool windows
-> Database
). Deze kun je de connection string geven die in appSettings.Development.json
ook staat voor gebruik door de applicatie, en dan connect hij.
Hier een voorbeeld van genereren van een (data) migration:
dotnet ef migrations add IdVeldInPriemCheckResultaat --project PriemCheckerLibrary --startup-project WebPriemChecker
En hier een voorbeeld van uitvoeren van deze migratie:
dotnet ef database update --project PriemCheckerLibrary --startup-project WebPriemChecker
De kern is hierbij dotnet ef database update
. Maar de --project
flag setting helpt zodat je dit commando vanuit de root PriemChecker
folder kunt uitvoeren en niet eerst een cd PriemCheckerLibrary
in hoeft om het project met de ...Context
bestanden erin in te gaan. En het --startup-project
zorgt ervoor dat de migrations de configuratie uit de appSettings.*.json
bestanden in dit web project kunnen lezen (via de hulpklasse PriemCheckContextFactory
).