Visual Studio Code (VS Code) er et alsidigt udviklingsmiljø, hvor udvidelser spiller en central rolle for at forbedre funktionaliteten og tilpasse arbejdsoplevelsen til specifikke behov. Installationen af udvidelser bør ske med omtanke, idet de giver adgang til værktøjer som syntaksfremhævning, IntelliSense, debugging og integration med forskellige platforme og tjenester. Blandt de mest anvendte udvidelser i .NET-udvikling findes C# for Visual Studio Code, der understøtter alt fra redigering til debugging af C#-projekter på tværs af Windows, macOS og Linux. MSBuild project tools forbedrer IntelliSense for MSBuild-projektfiler, mens REST Client muliggør afsendelse af HTTP-forespørgsler direkte fra editoren, hvilket effektiviserer test og udvikling af webtjenester. For dem, der arbejder med .NET-samlinger, tilbyder ilspy-vscode dekompilering af MSIL-assemblies med support til flere .NET-varianter.

Azure Functions-udvidelsen forenkler oprettelse, debugging og deployment af serverløse applikationer, men kræver desuden Azure Account og Azure Resources-udvidelser for fuld funktionalitet. Integrationen med GitHub via udvidelsen GitHub repositories giver mulighed for direkte adgang til og manipulation af fjernlagre uden at forlade VS Code. Til udvikling med databaser er SQL Server-udvidelsen et kraftfuldt værktøj, og vscode-proto3 sikrer support for Protobuf med bl.a. syntax highlighting og validering.

Det er væsentligt at forstå, at Visual Studio Code opdateres regelmæssigt med nye funktioner og fejlrettelser, typisk en større version om måneden samt hyppigere mindre opdateringer. Dog er versionen af udvidelser, eksempelvis C#-udvidelsen, ofte vigtigere end selve VS Code-versionen for at understøtte de nyeste sprogfunktioner og forbedringer. Det anbefales derfor altid at holde udvidelser opdaterede for at få optimal udviklingsoplevelse og adgang til nye funktioner.

Tastaturgenveje i VS Code kan variere mellem operativsystemer, og derfor vises genveje i denne bog kun i situationer, hvor de gentages ofte, som fx under debugging. Brugerdefinerede genveje kan nemt oprettes og tilpasses via VS Codes indbyggede funktionalitet, og officielle genvejsguides er tilgængelige som PDF’er for Windows, macOS og Linux.

Adgang til kodeeksempler via GitHub kan hjælpe med at forstå praksisnær brug af VS Code og udvidelser. Projekter til Visual Studio 2022 og Visual Studio Code ligger i separate mapper, hvilket sikrer, at man kan arbejde optimalt med det foretrukne miljø.

Når man arbejder med Azure-ressourcer, skal man være opmærksom på omkostninger. Selvom der ofte findes gratis niveauer eller lokale udviklingsalternativer (fx SQL Server Developer Edition, Cosmos DB Emulator, Azurite), kan aktive ressourcer på Azure medføre omkostninger. Det er derfor god praksis at slette ressourcer straks, de ikke længere er nødvendige, for at holde udgifterne nede. Brugerne får typisk startkreditter og gratis tjenester i en begrænset periode, og det er vigtigt at følge med i forbruget via Azure’s administrationsværktøjer.

For at forbedre kodekvaliteten yderligere anbefales brug af .NET-analysetools som StyleCop, der hjælper med at identificere potentielle problemer og sikrer ensartet kodestil. Integrationen sker gennem tilføjelse af StyleCop-pakken til projektet, hvor konfiguration kan styres via en JSON-fil (stylecop.json). Denne fil understøtter IntelliSense under redigering og kan tilpasses til projektspecifikke krav, samtidig med at den ekskluderes fra udgivne builds. Det er værd at bemærke, at StyleCop stadig kan være i preview-versioner, hvilket betyder, at opdateringer bør overvåges for at drage fordel af nye forbedringer.

Det er vigtigt at have et helhedsperspektiv på brugen af VS Code og dets udvidelser: de er ikke blot isolerede værktøjer, men fungerer i samspil med operativsystem, udviklingsprojekter, skyplatforme og workflows. Forståelsen af, hvordan man kombinerer disse elementer effektivt, skaber en stabil, produktiv og fremtidssikret udviklingsproces. At være opmærksom på opdateringer, omkostningsstyring ved brug af cloud-tjenester, og at vedligeholde en ensartet kodekvalitet gennem analysetools, er nøglefaktorer, som bør integreres i udviklerens vaner for at opnå succesfuld softwareudvikling med Visual Studio Code.

Hvordan bruger man OData-tjenester i et ASP.NET MVC-projekt?

Når man arbejder med OData i et ASP.NET MVC-projekt, er det nødvendigt at følge nogle grundlæggende trin for at etablere forbindelsen og korrekt håndtere forespørgsler. I denne proces lærer vi, hvordan man eksponerer data via en OData-tjeneste og integrerer den i en MVC-applikation.

For at komme i gang med en MVC-klient, skal vi først vælge projektet Northwind.OData.Client.Mvc som det aktive OmniSharp-projekt i Visual Studio Code. Herefter skal vi tilføje en projektreference til Northwind.Common.EntityModels.SqlServer projektet, som findes i Chapter02-mappen. Dette er nødvendigt for at kunne kommunikere med databasen og hente data, som senere vil blive vist i applikationen.

Når referencen er tilføjet, bygger du projektet Northwind.OData.Client.Mvc for at sikre, at alle ændringer er blevet korrekt implementeret. Åbn derefter filen launchSettings.json i Properties-mappen og opdater applicationUrl til at bruge port 5102 med HTTPS, som vist i koden:

json
"applicationUrl": "https://localhost:5102"

Dette sikrer, at applikationen kan køre sikkert over HTTPS-protokollen.

Dernæst, i Models-mappen i projektet, tilføjer du en ny klassefil kaldet ODataProducts.cs, som vil håndtere de produkter, der hentes via OData-tjenesten. Klassen skal se ud som følger:

csharp
using Packt.Shared;
namespace Northwind.OData.Client.Mvc.Models; public class ODataProducts { public Product[]? Value { get; set; } }

I Program.cs-filen skal du tilføje en reference til System.Net.Http.Headers for at kunne håndtere mediatyper i HTTP-hoveder. Det gøres med denne import:

csharp
using System.Net.Http.Headers; // MediaTypeWithQualityHeaderValue

Dernæst skal du konfigurere HTTP-klienten til at anmode om JSON-format som svardata, når du foretager anmodninger til OData-tjenesten. Dette gøres ved at tilføje følgende konfiguration:

csharp
builder.Services.AddHttpClient(name: "Northwind.OData", configureClient: options => {
options.BaseAddress = new Uri("https://localhost:5101/"); options.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json", 1.0)); });

For at kunne kalde OData-tjenesten på forsiden af hjemmesiden, skal du i Controllers/HomeController.cs erklære et felt til at gemme den registrerede HTTP-klientfabrik, som følger:

csharp
protected readonly IHttpClientFactory clientFactory;

I konstruktøren for HomeController skal du tilføje følgende kode for at opbevare klientfabrikken:

csharp
public HomeController(ILogger logger, IHttpClientFactory clientFactory) { _logger = logger; this.clientFactory = clientFactory; }

Nu kan du oprette en Index-metode, der er asynkron og henter data fra OData-tjenesten. Denne metode vil hente produkter, hvis navn starter med "Cha", og gemme dem i ViewData-ordbogen:

csharp
public async Task Index(string startsWith = "Cha") {
try { HttpClient client = clientFactory.CreateClient(name: "Northwind.OData"); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, $"catalog/products/?$filter=startswith(ProductName, '{startsWith}')&$select=ProductId,ProductName,UnitPrice"); HttpResponseMessage response = await client.SendAsync(request); ViewData["startsWith"] = startsWith; ViewData["products"] = (await response.Content.ReadFromJsonAsync<ODataProducts>())?.Value; } catch (Exception ex) { _logger.LogWarning($"Northwind.OData service exception: {ex.Message}"); } return View(); }

I Views/Home/Index.cshtml-filen skal du erstatte eksisterende markup med den kode, der viser produkterne, og som gør det muligt for brugeren at søge på produktnavne, der starter med en bestemt tekst. Det kan gøres på følgende måde:

html
@using Packt.Shared @{ ViewData["Title"] = "Home Page"; Product[]? products = ViewData["products"] as Product[]; } <h2>@ViewData["Title"]</h2> @if (products is not null) { <p>Produkter der starter med '@ViewData["startsWith"]' via OData</p> @if (products.Length == 0) { <p>Ingen produkter fundet.</p> } else { @foreach (Product p in products) {
<div>@p.ProductId - @p.ProductName - @(p.UnitPrice is null ? "" : p.UnitPrice.Value.ToString("c"))</div>
} } }
<form> <input type="text" name="startsWith" placeholder="Produktnavn starter med:" /> <button type="submit">Tryk ENTER for at søge.</button> </form>

Når du har konfigureret applikationen, kan du starte både Northwind.OData.Service- og Northwind.OData.Client.Mvc-projekterne uden debugging og åbne Chrome til adressen https://localhost:5102/. Du vil bemærke, at OData-tjenesten nu returnerer de produkter, der matcher den forespørgsel, du har angivet. Når du skriver et søgeord som "Cha", vil tre produkter blive returneret, som vist på skærmen.

En vigtig del af OData-tjenesterne er også at observere de SQL-forespørgsler, der bliver udført i baggrunden. For eksempel, når du kører en forespørgsel, som filtrerer produkter, der starter med "Cha", kan du se den SQL-kommando, der bliver eksekveret:

sql
SELECT [p].[ProductId], [p].[ProductName], [p].[UnitPrice] FROM [Products] AS [p] WHERE LEFT([p].[ProductName], LEN(@__TypedProperty_0_1)) = @__TypedProperty_0

Derudover skal du være opmærksom på, at OData-tjenesten understøtter komplekse forespørgsler, som for eksempel filtrering og ordning af data. Ved at køre en forespørgsel som:

http
GET https://localhost:5101/catalog/products?$filter=contains(ProductName, 'ch')&$orderby=Supplier/Country,UnitPrice&$select=ProductName,UnitPrice&$expand=Supplier

Får du et svar, der indeholder de produkter, hvis navne indeholder "ch", og som er sorteret efter leverandørens land og enhedspris.

Når du arbejder med OData, er det vigtigt at forstå både databasens struktur og hvordan du kan optimere dine forespørgsler for at få de ønskede resultater hurtigt. Det er også nyttigt at forstå, hvordan du kan bruge $filter, $orderby, $expand, og andre OData-operatorer for at sammensætte mere komplekse forespørgsler, der kan opfylde specifikke krav i dine applikationer.