Coding Dojo: .NET Core op macOS en Linux - Deep Dive (#3)

Na de eerste twee delen van deze blogserie is het nu tijd voor een Deep Dive! We bespreken NuGet, Dependency Injection, Unit Testing, en meer...

Dit is deel drie in een serie. Eerder beschreven we in deel 1 al het event zelf, en in deel 2 vertelden we over de basis van de cross-platformervaring. In dit deel gaan we technisch het diepe in duiken!

.NET Core in vogelvlucht

Eerder schreef ik op Medium.com al over hoe .NET Core en .NET Standard op grote lijnen in elkaar steken. Ik ga er hier even vanuit dat je dat al ongeveer weet. Zo niet: lees die intro dan even. Ik wacht wel, je bent binnen 10 minuten klaar...

...Okay, mooi! Dan kunnen we nu wat interessante inhoudelijke dingen bespreken van .NET Core. Dingen die ook in de Dojo aan bod komen. Hoewel niet uitputtend, raakt dit wel de kern van het hele .NET Core verhaal. We bespreken deze punten:

  • NuGet
  • Dependency Injection
  • Unit Testing

Duikbril op? Dan gaan we het diepe in duiken!

NuGet

Een van de eerste stappen in de Dojo is het beheren van NuGet packages voor je codebase. NuGet is de standaard package manager voor .NET Core (en het "oude" .NET Framework). Er zijn packages beschikbaar voor verwerken van JSON, draaien van tests en benchmarks, parsen van CSV, enzovoorts. Daarnaast worden de applicatieframeworks van Microsoft ook uitgerold als NuGet packages, waaronder ASP.NET Core.

Elk package kan compatible zijn met één of meer "target frameworks". Zo is bijvoorbeeld het populaire package "NUnit" beschikbaar voor alle "oude" (Windows-only) .NET Frameworks, en voor .NET Standard 1.6 en 2.0. Het mooie van .NET Standard (zoals je weet, omdat je mijn Medium post hebt gelezen...) is dat je die packages kunt gebruiken in alle Frameworks die aan die versie van .NET Standard voldoen. Zo is NUnit dus via .NET Standard 2.0 beschikbaar op verscheidene frameworks, waaronder .NET Core 2.0.

In de Dojo hebben we gewerkt aan een .NET Core 2.0 (inmiddels is ook 2.1 uit) applicatie. Dus kunnen we alle packages gebruiken die een versie aanbieden voor .NET Standard 2.0. Als je de Dojo hebt gevolgd heb je zelf verschillende packages ook toegevoegd. Hoe dat werkt verschilt per IDE, dus dat kun je zelf uitpluizen, of je kunt deel 2 van deze blogserie er nog eens op naslaan.

Een van de dingen die wij al voor je gedaan hadden in de Dojo was het toevoegen van ASP.NET Core via NuGet. Dit is het (open source) applicatieframework van Microsoft voor bouwen van API's (en daarnaast ook de basis voor het MVC framework, wat we hier verder niet behandelen). We voegden dit toe in ons API project met een referentie naar het "meta" package "Microsoft.AspNetCore.All". Hiermee haal je voor het gemak (wel zo handig bij een Dojo) alle dependencies binnen voor het bouwen van een API.

En dat brengt ons mooi bij het volgende punt...

Dependency Injection

In ASP.NET Core zit Dependency Injection hard ingebakken. Alle services binnen het application framework worden vanuit de basis DI Container geresolved. Denk daarbij bijvoorbeeld aan de API Controller classes, maar ook aan het zelf leveren van implementaties van framework interfaces.

Met name omdat deze ingebouwde DI Container ook jouw API controllers zal resolven, is de container ook by default verantwoordelijk voor het resolven van jouw applicatieservices. Bijvoorbeeld als jouw Controller in de constructor vraagt om een specifieke domeinservice of data repository, dan wordt die automatisch geïnjecteerd. Tenzij je natuurlijk geen DI wilt, dan kun je altijd je dependencies zelf constructen in een class.

In de Dojo kom je er bij stap 5 aan toe om zelf wat dingen in de Container aan te passen. Daar leer je wat basics over hoe de default DI Container werkt.

Nu is het een interessante maar ook controversiële keuze geweest van Microsoft om een standaard DI Container-implementatie te leveren, want met die implementatie komt ook een specifieke abstractie mee. Dat betekent dat auteurs van andere DI Frameworks voor .NET (waar geen gebrek aan is!) op zijn minst een brug moeten hebben naar die abstractie. Zelfs als dat eigenlijk niet logisch is, bijvoorbeeld omdat er met andere soorten lifetimes gewerkt wordt.

Hoewel Microsoft dus Dependency Injection als techniek een mooie boost geeft, is niet iedereen blij. Een goede, diepgaande uitleg van de problemen met deze keuze laat ik over aan deze uitstekende blogpost van SimpleInjector auteurs. Hun conclusie: gebruik de default container zonodig (of zo verplicht) voor Application Framework services, en gebruik een custom DI Container voor je applicatie. Dan kun je in jouw eigen applicatie tenminste een container gebruiken en opzetten die past bij jouw specifieke wensen.

De bottom line is uiteindelijk wel belangrijk. Dependency Injection kan immers zeer behulpzaam zijn bij het schrijven van "loosely coupled, highly cohesive" code. En dat leidt vaak weer tot goed testbare code. Wat ons brengt naar het volgende ondwerp...

Unit Testing

In stap 6 van de Dojo ga je aan de slag met Unit Testing in .NET Core. Er zijn meerdere keuzes voor testing framework, die elkaar niet gek veel ontlopen. De voornaamste opties zijn MSTest, NUnit, en xUnit. Wij gebruikten de laatste.

De basis van al deze frameworks is overigens hetzelfde. Per conventie maak je een Test project aan per "gewoon" project. Elke unit (typisch een class) krijgt zijn eigen Test class. Elke test is dan een methode die gemarkeerd wordt met een Attribute, bijvoorbeeld zo met xUnit:

[Fact]
public void Tests_are_working()
{
    Assert.True(9001 > 42);
}

Zodra je de tests gaat draaien wordt door je code gezocht naar alle publieke methodes met zo'n [Fact] attribuut. Die methodes worden dan als tests uitgevoerd.

Wat we niet laten zien in de Dojo, maar wat wel ook heel goed kan: Integration Testing met deze "unit" testing frameworks. Scott Hanselman laat hier meer over zien in een recente blogpost. Feitelijk start je dan in-memory een echte mini-webserver op die jouw API host. In je tests kun je dan met een echte API client je API testen, inclusief response codes, headers, enzovoorts.

En met dit laatste stuk rondom tests hebben we de drie grote interessante features van .NET Core development gehad. Tijd om weer even uit te zoomen naar een hoger niveau.

Ter Conclusie

In deze drie blogposts hebben we je door de Dojo, de cross-platform ervaring, en de basis code-elementen heen geprobeerd te loodsen. De diepe duik van deze blogpost is in feite ter aanvulling en verdieping van de Dojo zelf. Mocht je de Dojo nog niet gedaan hebben: hij staat voor je klaar!

Uiteraard hebben we met deze drie technische onderdelen nog lang niet alle onderwerpen gehad. Dat wisten we tijdens het maken van de Dojo ook al. Daarom laten we je aan het eind ook achter met "Exercises for the Reader". Die serie links geven een goed overzicht van waar je verder kunt uitbreiden met je kennis.

Of misschien wilde je gewoon een beetje meelezen en op de hoogte blijven van dingen. Even goede vrienden natuurlijk! Hopelijk heb je iets geleerd van de Dojo en/of deze blogseries. Wij hebben in ieder geval een hoop geleerd tijdens het maken en schrijven!

En dan rest ons nog dit natuurlijk: tot de volgende Dojo? Stay tuned!

[Jeroen is developer bij Infi]

Op de hoogte blijven van onze updates over techniek, toffe projecten of een kijkje achter de schermen? 
Meld je dan aan voor onze nieuwsbrief!

Infi maakt het allemaal waar:

Webapplicaties

Wij ontwikkelen webapplicaties op maat waarmee we jouw ideeën waarmaken. Maatwerkapplicaties gebouwd door ambitieuze nerds die niet schrikken van uitdagende logica, complexe databases, datamigraties of betaalomgevingen. Daarnaast verzorgen we ook de hosting, onderhoud en support. Wij willen jouw ideeën fixen. Wil je weten hoe?
Ontdek wat een webapplicatie voor je kan doen >

Mobiele apps

We zijn nerds met liefde voor softwareontwikkeling, dus ook voor de ontwikkeling van mobiele applicaties (apps). Native apps voor iOS en Android, maar ook voor mobiel gebruik geoptimaliseerde webapplicaties. Wij weten wat erbij komt kijken en hebben de kennis voor web, iOS en Android allemaal in huis. Wil je weten wat het beste bij je past? 
Ontdek wat een mobiele app voor je kan doen >

Infi Bootstrap: kickstart je startup

Je hebt een droom die je waar wilt maken. Daarom ben je een startup gestart en wil je met een beperkt budget binnen korte tijd van jouw droom een innovatief product maken. Wij als waarmakers begrijpen dat. Daarom zijn we voor jou met Infi Bootstrap gestart. De unieke springplank voor tech-startups om jou naar de top te helpen.
Kickstart je startup met Infi Bootstrap >

Wil je iets waarmaken met Infi?

Wil jij een eigen webapplicatie of mobiele app waarmee jij het bij anderen maakt?

Waargemaakt door de nerds van Infi.
Nerds met liefde voor softwareontwikkeling en die kunnen communiceren. En heel belangrijk: wat we doen, doen we met veel lol!

Wij willen het fixen. Laat jij van je horen?

Voor wie heb je een vraag?