Blog

.NET Core 3.0 features

Met de komst van .NET Core 3.0 in september zet Microsoft een nieuwe stap voor het .NET platform. Niet alleen wordt het framework met .NET Core versie 3 een stuk completer, het gaat ook (nog) beter presteren, minder ruimte in beslag nemen en bevat veel meer diagnostics tooling (https://docs.microsoft.com/en-us/dotnet/core/whats-new/dotnet-core-3-0).

Verder is het ook de eerste stap naar “One .NET” (https://devblogs.microsoft.com/dotnet/introducing-net-5/) waardoor we vanaf september 2020 met .NET 5 verder gaan. In deze blog lopen we langs de belangrijkste nieuwe features van .NET Core 3.0. Per feature zal ik de komende tijd losse blogposts maken waarin er dieper op ingegaan wordt.

.NET Core 3.0 features

Met ASP.NET Core 3.0 brengt Microsoft een aantal nieuwe toevoegingen aan het toch al rijke ASP.NET Core. Naast een goede performance verbetering zien we o.a. de volgende nieuwe features:

  • Razor components
  • gRPC
  • Worker Services
  • Diagnostics verbeteringen

Razor components (Server side Blazor) Razor components komt vanuit het Blazor framework (https://dotnet.microsoft.com/apps/aspnet/web-apps/blazor) en is eigenlijk server side Blazor. Hierdoor wordt het mogelijk om Single Page Applications te bouwen zonder hiervoor ook maar één letter Javascript te hoeven schrijven. Het mooie is ook dat Razor components prima te combineren zijn met MVC en Razor pages. Hierdoor is het eenvoudig om bijvoorbeeld een bestaande webapplicatie uit te breiden met componenten die een SPA-ervaring geven. De bestaande applicatie hoeft dan niet eerst helemaal omgeschreven te worden.

Razor Components zijn componenten die op de server draaien. Via een SignalR connectie worden events in de browser (bijvoorbeeld een klik op een knop) naar de server verstuurd. Op de server wordt de logica die bij dit event hoort uitgevoerd. Vervolgens wordt er gekeken naar het verschil in de DOM voor en na het event. Dit verschil wordt over de SignalR connectie teruggestuurd naar de browser. In de browser wordt de DOM vervolgens bijgewerkt.

razor-components

Op deze manier kun je dus “Full-stack webdevelopment” doen zonder een letter Javascript te hoeven gebruiken. Er zitten natuurlijk wel een aantal voor- en nadelen aan deze manier van ontwikkelen.

Voordelen:

  • Thin client, er is weinig initiële laadtijd
  • Je kan de volledige .NET runtime gebruiken
  • Het zorgt voor een eenvoudige architectuur. Waar je bij een traditionele SPA applicatie een API laag dient te ontwikkelen is dat hier niet nodig. Vanuit je Razor Components kun je direct de applicatie laag aanspreken die je normaal gesproken vanuit je API laag aan zou spreken.

Nadelen:

  • Doordat input naar de server verstuurd wordt, daar verwerkt en het verschil in de DOM teruggestuurd wordt kan er enige vertraging optreden.
  • Je maakt veel meer gebruik van je server resources. Hierdoor kunnen de kosten oplopen.
  • Offline kan je applicatie niet functioneren, er dient altijd een verbinding met de server te zijn.

Zie ook: https://docs.microsoft.com/en-us/aspnet/core/blazor/components?view=aspnetcore-3.0

gRPC

gRPC is een RPC (Remote Procedure Call) framework dat origineel ontwikkeld is door Google. Sinds 2015 werkt Google hier via een open source project aan. In .NET Core 3.0 wordt dit volledig ondersteund. Maar wat is gRPC precies? gRPC is een framework waarbij m.b.v. een binair transport protocol over HTTP/2 gecommuniceerd wordt. Dit zorgt voor efficiëntie maar biedt ook mogelijkheden als twee richtingen communicatie. Zowel de client als de server kunnen berichten naar elkaar sturen. Daarnaast wil gRPC taal en platform onafhankelijk zijn. gRPC werkt o.b.v. een universele taal “Protocol Buffers”. Met deze taal leg je het contract tussen de client en de server vast. O.b.v. dit contract kan er met gRPC code gegenereerd worden voor vrijwel alle moderne programmeertalen (en dus ook C#).

gRPCLanguages-450x165

In mijn blogpost over gRPC meer over deze techniek en hoe je deze kan toepassen.

Worker Services

In de laatste versies van Visual Studio 2019 is een project template toegevoegd voor Worker Services. Dit template is uitermate geschikt om lang lopende processen mee te ontwikkelen. Een Worker Service is een console applicatie die ook eenvoudig als Windows Service gedraaid kan worden. Hiervoor wordt het Microsoft.Extensions.Hosting.WindowsServices NuGet package gebruikt. Deze bevat een extension method UseServiceBaseLifetime welke in de Startup class gebruikt kan worden.

Lees hier meer over in mijn blog over Worker Services.

Diagnostics verbeteringen

Met ASP.NET Core 3.0 worden er 3 nieuwe tooltjes geleverd waardoor je meer inzicht kan krijgen in het gedrag van je applicatie:

  • dotnet-counters
  • dotnet-trace
  • dotnet-dump

Veel meer over deze nieuwe tools kun je lezen op https://devblogs.microsoft.com/dotnet/introducing-diagnostics-improvements-in-net-core-3-0/

C# 8.0 FEATURES

Met de komst van .NET Core 3.0 en de laatste update van Visual Studio 2019 komt ook C# 8.0 in september officieel uit. C# 8.0 biedt tal van nieuwe features die het leven van de programmeur vereenvoudigen. Een aantal belangrijke hiervan zijn:

  • Nullable reference types (dwingt betrouwbaardere code af)
  • Async streams (await foreach)
  • Ranges (eenvoudig selecties uit arrays halen)
  • Default implementations on interfaces (niet elke class hoeft alle methodes nog te implementeren)
  • Recursive patterns (eenvoudiger matchen bij gebruik van de ‘is’ operator)
  • Switch expressions (traditionele switch statemens eindelijk in een modern jasje)

In mijn blogpost over C# 8.0 features ga ik dieper in op wat deze features inhouden en hoe je ze kan gebruiken.

SELF CONTAINED EXECUTABLES

Het was met .NET Core al mogelijk om het framework bij elke deployment mee te publishen. Hierdoor is het mogelijk om verschillende versies van het framework op één machine naast elkaar te draaien. Een nadeel was wel dat er naast de applicatie specifieke DLL’s een heleboel DLL’s van het framework mee opgeleverd werden in de publish folder. Met .NET Core 3.0 is het nu mogelijk om de applicatie als Single Executable te publishen. Dit kan eenvoudig door in de project file aan te geven dat deze als SingleExecutable gepublished moet worden:

Self Container Executable Configuration

Wat er vervolgens gebeurd is dat de folder die voorheen gepublished werd nu gezipt wordt en als een executable opgeslagen. Op het moment dat deze executable gestart wordt dan wordt deze uitgepakt naar een tijdelijke folder. Vanuit deze tijdelijke folder wordt de applicatie vervolgens gestart. Dit kan de eerste keer voor enige vertraging zorgen bij het starten. Een volgende keer zal herkend worden dat hij al uitgepakt is en wordt de applicatie direct gestart.

DESKTOP SUPPORT

Met .NET Core 3.0 is het mogelijk om Windows Forms en WPF applicaties te ontwikkelen. De volgende blog geeft hier een goede blik op: https://blog.ndepend.com/net-core-3-0-support-for-wpf-and-winforms-apis/

Wat wel goed is om te weten is dat Microsoft deze support enkel voor het Windows platform beschikbaar maakt. Het gebruik van WPF en Windows Forms zal dus niet mogelijk zijn op bijvoorbeeld Linux.