Vem är inlägget riktat mot?

Det är inriktat mot dig som antingen redan jobbat med .NET utveckling tidigare eller har ett intresse för det. Så för att underlätta för er ”utomstående” har jag valt att inkludera länkar så det finns möjligheter att fördjupa sig.

Läslängd är ungefär 9 och en halv minut.

Vem är jag?

Jag är en full-stackutvecklare med ett par års erfarenhet. Jag har hittills främst inriktat mig mot .NET-utveckling.

Gillar att kunskapsförmedla och få nya erfarenheter.

Vad är .NET Core?

Sedan den 14:e augusti i år är .NET Core 2.0 officiellt släppt som en produkt, och innan jag förmedlar min erfarenhet så kanske en kort förklaring om vad det är kan vara på sin plats.

Microsofts ambition var att skapa ett nytt ramverk för utveckling inom .NET, som ska vara bättre anpassad efter den moderna hårdvaran.
Ett annat ambitiöst och överraskande steg var deras tillkännagivande att .NET Core ska vara ”cross-platform”, och tillåta .NET-utveckling på inte bara Windows utan också på macOS och Linux, på olika typer av enheter, molnlösningar och inbyggda system. Läs mer om hur det fungerar här.

För att ytterligare chocka så är det öppen källkod, så utvecklingen bedrivs av Microsoft och .NET-communityn, ett av många steg i Microsofts nya affärsstrategi.

Det utvecklades en gratis variant av deras utvecklingsprogramvara Visual Studio årsmodell 2015 som döptes till Community som kunde användas för .NET Core-utveckling samt en variant som inte är fullt lika tung som sin storebror, men fortfarande stödjer IDE, som heter Visual Studio Code.

En komplett lista med kriterier för att utveckla inom .NET Core på Windows finns här, för macOS här, och för Linux här.

Varför .NET Core?

Varför skulle man intressera sig för .NET Core? Här kommer några anledningar:

  • C# är kanske inte mest använt, men är ett av de populäraste språken på marknaden, du kan även se det här. Läs mer om C# här.
  • Senaste versionen av C# är 7.1  och utökar de redan moderna möjligheterna som finns i 7.0 och bakåt. C# har funnits i 15 år och utvecklas och anpassas successivt hela tiden efter marknad och krav.
  • .NET erbjuder mångsidighet. Du kan skriva desktop appar, web applikationer, backgrunds tjänster, mobila appar tack vare Xamarin och spelutveckling i Unity. Det är bara några klick bort att deploya mot Azure, i mitt tycke den bästa molntjänst lösningen som finns.
  • En väldigt genomarbetad och integrerad IDE i Visual Studio som har stöd för både verktyg och kringprodukter, som den omåttligt populära ReSharper.
  • Det finns bra standardiseringar och praxis redan implementerade. Kommunikation mot datalager med EF, mer kommer längre ned, MVC ramverk, hantering av JSON med flera. Dina skickligheter blir portabla.
  • Det är som omnämnt i tidigare stycke öppen källkod, och finns på GitHub för alla att se och bidra till.
  • .NET Core är omskrivet från grunden och har bättre prestanda än .NET Framework, står en del om det här. Det kan finnas affärsnytta i att byta.

 

Första intrycket

Första gången jag provade .NET Core var det skinande nytt och innan 1.0 var en officiell produkt. De verktyg man ville använda hade inte alltid stöd, och ett försök att konvertera ett projekt till .NET Core bidrog med kompabilitetsproblem då inte alla bibliotek var uppdaterade.

Det introducerades även en ny version av MVC, MVC 6, och en del arkitektur förändringar i projektens struktur skedde. Man introducerade NPM för att hantera versioner av lokala javascript-bibliotek tillsammans med bower och gulp.

Förutom vad produkten hade för ambitioner var mitt generella intryck inte positivt, och att försöka migrera icke från standard .NET Framework till det nya fräsiga .NET Core blev för omständligt. Jag valde att jag ta en paus från detta, och vänta på en mer utvecklad produkt.

Vad finns i just 2.0?

Det finns mycket nyheter, både stora som små, och man kan läsa dessa här. Men den nyheten jag väljer att  fokusera på här är något av det mest intressanta för mig: Razor Pages.

Razor Pages bygger ovanpå .NET MVC-implementationen. I korta ordalag så byter Razor Pages ut Controller i begreppet MVC, och man kan då skriva affärslogik som rör en specifik operation, exempelvis skapa eller ändra någonting, inom ett och samma sammanhang.
Personligen tycker jag det passar mig bättre, men blir det en större applikation kan det måhända bli rörigt. Men man kan också fortfarande använda sig av Controllers. Grunden till Razor Pages bygger på det.

Man behöver inte längre implementera antiforgery tokens,  Razor Pages gör det automatiskt.
Razor Pages mappar hanterare för alla befintliga HTTP verb som vi kan lägga till metoder för. GET metoden i en Controller blir här OnGet och OnGetAsync för asynkron metod.

Nuvarande intryck

Samtidigt som 2.0 officiellt släppts började jag utveckla ett administrativt verktyg som kan gagna min arbetsgivare. Jag tänkte att jag skulle ta 2.0 på en åktur och se vad det går för. Gammal vana trogen blev ”database first”-principen och efter att ha designat en MSSQL databas bestämde jag mig för att prova på Microsofts egna ORM som heter Entity Framework (förkortas EF), i det här fallet Entity Framework Core.

Efter att ha gjort ett nytt projekt i .NET Core 2.0 började jag fundera hur gjorde man för att skapa en context-fil i .NET Core?
Det visade sig vara lättare än jag trodde. Först var man tvungen att installera lite paket via NuGet, som man kör i det integrerade package manager host-fönstret i Visual Studio:

Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools
Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design

Därefter kunde man skriva ett kommando som ingår i det sista installerade paketet i listan:

Scaffold-DbContext "<Connection string till din server och databas här>" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Data

Där vi kan dela upp kommandot såhär:

  • Scaffold-Context är själva kommandot som ska utföras, vi vill låta ett verktyg skapa context filen åt oss.
  • Inom citattecknen har vi vår anslutningssträng till databasen med kredentialer för att ansluta.
  • Senare kommer vilken mekanism vi vill använda för att översätta tabellerna.
  • Och -OutPutDir låter oss ange vart vi vill att modellerna (objekten som mappas mot tabellerna) ska hamna.

Voila! Context-filen är klar. Och för att sedan skapa vyer kunde man använda .NET Core CLI i ett Developer Console fönster när man navigerat sig fram till projektmappen:

dotnet aspnet-codegenerator razorpage -m <Modell> -dc <contextnamn> -udl -outDir Pages\<Önskat mappnamn> –referenceScriptLibraries

Mer om kodgenerering kan du läsa i den här artikeln.

Routing i Razor Pages

Routing i detta fall är hur man matchar webbadresser till resurser på servern. Det enklaste sättet är att kartlägga webbadresser till fysiska filer på disken, och detta är den metod som har implementerats av ASP.NET-teamet för razor sidoramen.
Alla sidor vi lägger i Pages mappen med filändelsen .cshtml kommer automatiskt bli uppfångade och kopplade ihop med routing där konventionen är att använda filens namn.
Så exempelvis About.cshtml i mappen Pages blir https://www.<dinwebsite>.se/About. Undermappsexempel: Pages/Customers/Details.cshtml blir https://www.<dinwebsite>.se/Customers/Details.
Ett fint tips för att undvika query parametrar i form av https://www.<dinwebsite>.se/Customers/Details?id=232, så kan man sätta @page ”{id:int}” för att en mappning via id parametern är en int och på så vis blir URL:en https://www.<dinwebsite>.se/Customers/Details/232.

Vill du läsa mer om routing i Razor Pages, gör det här. Den bästa bilden jag hittade för att beskriva hur routing inom ASP.NET fungerar är denna:
Relaterad bild

Migrationer

Låt säga att vi ändrar lite på en modell och lägger till ett fält eller byter datatyp, då måste vi skapa en migration för det så modell och tabeller motsvarar varandra, och talar om för EF att göra det med kommandot:

Add-Migration -Context <ContextNamn>

Att ange context är endast obligatoriskt om vi har fler än en. Vi blir efter det kommandot uppmanade om att ange ett namn, vilket kommer namnge den script fil i C# som EF genererar åt oss. Man kan göra flera migrationer om man vill göra förändringarna i små portioner i taget, vilket precis som i versionshantering av din kod är att föredra. Sedan skriver man:

Update-Database -Context <ContextNamn>

Vad som däremot är lite jobbigt i det fallet jag påträffande är att tabellerna inte får finnas på förhand. Jag fick ett tips av en kollega som kan lösa problemet, mer om det kan man läsa här. Vilket är en bra möjlighet om man vill kunna ändra i tabeller under projekts gång.

Slutplädering

Jag har nu nuddat vid endast ett fåtal features i .NET Core 2.0.  Det finns så mycket att utforska inom ekosystemet att det kan vara lite svårt att veta vart man ska börja.

.NET Core 2.0 erbjuder mycket förändringar mot för när jag jobbade med det sist. Men det är en spännande riktning ihop med övrig .NET utveckling där Microsoft har möjlighet att konvertera utvecklare över till .NET miljön. Det är en spännande tid framför oss.

I mitt projekt gick det väldigt snabbt att komma upp på fötter, kod genereringen gav Razor Pages med Bootstrap 3.3.7, något som alla templates inom ASP.NET innehåller.
Jag är numera positivt inställd och ombord hype-tåget!

Ett tips är också att gå med i ASP.NET Cores Slack kanal om man vill hålla sig ajour med det senaste men även kunna få hjälpa av folk inom communityn eller inom .NET Core-teamet.

Tack för mig!