Gå til indholdet

N283C Forstå delegates (Serilog)

Dette er en indledende opgave i brugen af delegates. Se bort fra syntax, og kopier koden for at se, hvad der sker. Opgaven handler om at få en ide om, hvordan en funktion kan sendes ind i en klasse og kaldes senere.

  • Opret en konsolapp.
  • Installer Serilog-pakkerne. Du kan gøre det fra terminalen:
dotnet add package Serilog
dotnet add package Serilog.Sinks.Console
dotnet add package Serilog.Sinks.File
dotnet add package Serilog.Sinks.EventLog

Hvis du bruger Visual Studio, kan du i Solution Explorer højreklikke på projektet og vælge Manage NuGet Packages. Søg efter og installer disse fire pakker:

  • Serilog
  • Serilog.Sinks.Console
  • Serilog.Sinks.File
  • Serilog.Sinks.EventLog

Vent med at køre programmet, til alle pakkerne er installeret.

  • Kopier følgende kode til Program.cs.
  • Kør programmet.
  • Se logbeskederne i konsollen, og åbn derefter filen logs/terning.log.
// Gør Serilogs typer tilgængelige i programmet.
using Serilog;

// Her samler vi hele logopsætningen ét sted.
// Alle logbeskeder sendes til de sinks, der står nedenfor.
Log.Logger = new LoggerConfiguration()
  // Vis logbeskeder direkte i konsolvinduet.
    .MinimumLevel.Information()
    .WriteTo.Console()
  // Gem de samme logbeskeder i en tekstfil.
    .WriteTo.File("logs/terning.log")
  // Skriv også de samme logbeskeder i Windows Event Log.
  // Kilden oprettes automatisk, hvis Windows tillader det.
    .WriteTo.EventLog("N283C Terning", manageEventSource: true)
    .CreateLogger();

// En Action<string> kan pege på en metode, der modtager én tekst.
// Lambdaen sender teksten videre til Serilog.
// Det er denne funktionsreference, som Terning får med ind i konstruktøren.
Action<string> logMetode = tekst => Log.Information("{Tekst}", tekst);

// Terning får logMetode som argument.
// Terning behøver derfor ikke selv at kende Serilog eller logdestinationerne.
Terning terning = new Terning(logMetode);

// Hver gang Ryst kaldes, kalder Terning den funktion, den har fået.
// Den samme besked kommer derfor til konsol, fil og Windows Event Log.
terning.Ryst();
terning.Ryst();
terning.Ryst();

// Sørg for at Serilog får skrevet alle ventende beskeder, før programmet lukker.
Log.CloseAndFlush();

public class Terning
{
  // Dette felt indeholder referencen til den funktion, Terning skal kalde.
    private readonly Action<string> logMetode;
    private readonly Random random = new Random();

  // Funktionen gemmes, når Terning-objektet bliver oprettet.
    public Terning(Action<string> logMetode)
    {
        this.logMetode = logMetode;
    }

    public void Ryst()
    {
    // Terningen laver sin egen opgave: den finder en ny værdi.
        int værdi = random.Next(1, 7);

    // Her kaldes den funktion, som blev sendt ind i konstruktøren.
    // Terning behøver ikke vide, hvad funktionen gør.
        logMetode($"Terningen blev rystet til {værdi}");
    }
}

Læg mærke til, at Terning ikke selv kender Serilog, konsollen eller logfilen. Den kender kun en Action<string>, som den kan kalde, når terningen bliver rystet.

Åbn Event Viewer i Windows, vælg Windows Logs > Application, og find hændelser med kilden N283C Terning.

manageEventSource: true betyder, at Serilog forsøger at oprette event source automatisk. Windows kan kræve, at programmet køres som administrator første gang. Hvis du ikke vil køre som administrator, skal event source oprettes på forhånd, og manageEventSource kan fjernes.

Prøv eventuelt at fjerne en af de tre .WriteTo-linjer. Du skal kun ændre opsætningen af Log.Logger – ikke klassen Terning.