# BASTA Spring 2023 - C# Workshop
## Agenda
Der Schwerpunkt des Workshops sind die neuen C#-Funktionen. Da einige jedoch Erweiterungen von Sprachkonstrukten sind, die sich über mehrere Versionen von C# entwickeln (z. B. Pattern Matching), werden wir da oder dort auch Themen wiederholen, die in den letzten C#-Versionen herausgebracht wurden.
Um die Spracherweiterungen von C# noch besser zu verstehen, werden wir im diesjährigen Workshop auch einen Blick auf die ASP.NET Core Minimal Web API werfen.
Es ist nicht das Ziel, eine umfangreiche Einführung in das neue Programmiermodell für Web-APIs zu bieten. Wir werden jedoch das Programmiermodell von Minimal APIs als Beispiel verwenden, um einige der neuen Sprachfunktionen in ihrer praktischen Anwendung zu sehen. Wer Lust auf einen ganzen Tag voller C#-Neuigkeiten, viel Beispielcode und wenig Slides hat, der ist beim C#-Workshop genau richtig.
## Workshopformat
Workshops auf der BASTA sind anders als Session-Vorträge. Wir nehmen uns Zeit, Dinge gemeinsam auszuprobieren und natürlich sind Workshops auch eine Gelegenheit, um individuelle Fragen zu stelle.
> Alle TeilnehmerInnen sind daher eingeladen, bei den Beispielen mitzumachen und/oder Fragen zu stellen. Je interaktiver der Workshop ist, desto interessanter für alle.
Bei einer Frage oder Wortmeldung einfach (digital) Hand heben oder eine Nachricht in den Chat schreiben.
## Systemvoraussetzungen für Beispiele
* Neueste C#/.NET-Version
* Visual Studio oder Visual Studio Code
## Code Samples
* [Figure Builder API](https://github.com/rstropek/Samples/tree/master/CSharpBasta23/figure-builder-api)
* [Delegates, methods, expression trees](https://github.com/rstropek/Samples/blob/master/CSharpBasta23/delegates/Program.cs)
* [C# 11 features samples](https://github.com/rstropek/Samples/tree/master/CSharp11/CSharp11.Features)
* [Pattern Matching](https://github.com/rstropek/Samples/blob/master/CSharp11/PatternMatchingInsideOut/Program.cs)
## Slides
* [C# 11 Slides](https://slides.com/rainerstropek/csharp-11/fullscreen)
* [C# 12 Slides](https://slides.com/rainerstropek/c-12/fullscreen)
## Ad-hoc Einführung Minimal Web API
```csharp
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<IGreetingBuilder, GreetingBuilder>();
builder.Services.AddTransient<InstanceGreetingHandlers>();
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.MapGet("/ping", () => "pong");
app.MapGet("/king", () => "kong");
app.MapGet("/greet", (string name) => $"Hello {name}!");
app.MapGet("/greet-via-path/{name}", (string name) => $"Hello {name}!");
app.MapPost("/king-post", () => "kong");
//app.MapPost("/greet", (PersonToGreet p, IGreetingBuilder builder) => builder.BuildGreeting(p.Name));
//app.MapPost("/greet", Greet);
//app.MapPost("/greet", GreetingHandlers.Greet);
var igh = app.Services.GetRequiredService<InstanceGreetingHandlers>();
app.MapPost("/greet", igh.Greet);
app.Run();
static string Greet(PersonToGreet p, IGreetingBuilder builder) => builder.BuildGreeting(p.Name);
// Data transfer objects - Records
public record PersonToGreet(string Name);
interface IGreetingBuilder
{
string BuildGreeting(string name);
}
class GreetingBuilder : IGreetingBuilder
{
public string BuildGreeting(string name)
{
return $"Hello {name}!";
}
}
```