Die Lokalisierung und Globalisierung von Webanwendungen sind entscheidende Schritte, um eine breitere Zielgruppe zu erreichen. Besonders bei der Arbeit mit ASP.NET Core 7 stellt sich häufig die Frage, wie man verschiedene Sprachen und Formate effizient implementiert, um eine benutzerfreundliche und kulturangepasste Erfahrung zu bieten. Eine der ersten Hürden in der Lokalisierung ist die korrekte Konfiguration der Sprachoptionen in den Einstellungen des Browsers, speziell in Google Chrome.

Zunächst einmal, um mehrere Sprachen hinzuzufügen, öffnet man die Einstellungen von Chrome und sucht nach den gewünschten Sprachen, in diesem Fall Französisch und Englisch, sowohl in der britischen als auch in der US-amerikanischen Variante. Dies erfolgt durch die Auswahl der entsprechenden Sprachpakete im Menü. Es ist zu beachten, dass die Bezeichnungen der Sprachen je nach der lokalisierten Version von Chrome variieren können. In einer spanischen Version von Chrome muss man beispielsweise nach „Francés“ suchen, während es in einer walisischen Version „Ffrangeg“ wäre. Nach dem Hinzufügen dieser Sprachen kann man sie in der Prioritätenliste umsortieren, sodass die bevorzugte Sprache – in diesem Beispiel Französisch (Frankreich) – ganz oben steht.

Ein weiterer Schritt ist das Aktualisieren der Seite, um die vorgenommenen Änderungen zu überprüfen. Nach einer erfolgreichen Umstellung der Spracheinstellungen kann man feststellen, dass die Seite nun in der ausgewählten Sprache erscheint und Formate wie Datumsangaben und Währungsangaben an die jeweiligen regionalen Gepflogenheiten angepasst sind. Es ist wichtig, dass man sich auch die Entwicklertools ansieht, um sicherzustellen, dass die richtigen Header wie der „Accept-Language“-Header gesetzt sind. Dieser Header enthält eine Rangfolge von Sprachpräferenzen und wird bei der Lokalisierung und Globalisierung der Inhalte berücksichtigt.

Ein fundamentales Konzept im Zusammenhang mit der Lokalisierung und Globalisierung von Webanwendungen ist der „Accept-Language“-Header. Dieser Header listet die bevorzugten Sprachen des Benutzers auf, wobei jede Sprache mit einem Qualitätswert (q) versehen werden kann. Der Qualitätswert gibt an, wie stark die Präferenz für eine bestimmte Sprache ist, wobei der Wert 1.0 für die bevorzugteste Sprache steht und Werte wie 0.9 oder 0.8 die geringere Präferenz anzeigen. Zum Beispiel bedeutet „en-US:1.0“, dass Englisch aus den USA die höchste Priorität hat, während „fr-FR;q=0.8“ auf eine geringere Präferenz für Französisch aus Frankreich hinweist.

Ein weiteres Thema, das oft im Kontext der Webentwicklung auftaucht, ist die Verwendung von Tag Helpers, um die Benutzeroberflächen einer Webanwendung zu gestalten. Tag Helpers bieten eine einfache Möglichkeit, statische HTML-Elemente dynamisch zu gestalten. Im Gegensatz zu HTML-Helfern, die komplexe, mehrfach verschachtelte Tags erzeugen können, sind Tag Helpers klarer und einfacher zu lesen. Dies ist besonders für Front-End-Entwickler von Vorteil, die sich mit HTML, CSS und JavaScript beschäftigen, da sie keine Kenntnisse in C# benötigen, um Tag Helpers zu verwenden. Die Attribute der Tag Helpers wirken dabei wie normale HTML-Attribute und sind oft mit IntelliSense in Code-Editoren wie Visual Studio oder Visual Studio Code verfügbar.

Ein einfaches Beispiel für die Verwendung eines Tag Helpers ist das Erstellen eines anklickbaren Links. Mit dem Anchor Tag Helper lässt sich ein Link auf eine Controller-Action leicht erstellen, und das Markup bleibt sauber und verständlich. So könnte man einen Link zu einer Seite mit der Datenschutzerklärung der Anwendung erstellen. Ein solches Beispiel zeigt, wie man das Markup so schreibt, dass der Link zu einer Controller-Action führt und dabei auch Parameter wie die ID des Benutzers oder das Land übergibt, was die URL dynamisch anpasst.

Tag Helpers sind besonders nützlich, wenn man mit ASP.NET Core arbeitet, da sie die Codebasis vereinfachen und die Wartbarkeit erhöhen. Zum Beispiel kann der Anchor Tag Helper durch die Verwendung des Attributs „asp-route-{parametername}“ zusätzliche Parameter wie „id“ oder „country“ übergeben. Diese Parameter müssen dann im Controller, der die Aktion ausführt, abgefangen und verarbeitet werden. Ein gutes Verständnis von Tag Helpers und deren Anwendung ist daher für die effiziente Entwicklung von Webanwendungen unerlässlich.

In der Praxis muss man auch sicherstellen, dass solche Links und Parameter korrekt verarbeitet werden. Ein Beispiel hierfür ist die Handhabung von optionalen Parametern im Controller, die bei Bedarf zur Filterung der angezeigten Daten verwendet werden. So kann eine Webanwendung z. B. Bestellungen nach Land oder nach Kunden filtern, wenn entsprechende Parameter in der URL übergeben werden.

Darüber hinaus ist es wichtig, dass Entwickler verstehen, wie das Routing funktioniert und wie man mit optionalen Parametern in ASP.NET Core arbeitet. Das ordnungsgemäße Filtern und Sortieren von Daten, je nachdem, welche Parameter übergeben werden, stellt sicher, dass die Benutzererfahrung nahtlos und effizient ist.

Für eine vollständige Lokalisierung muss außerdem berücksichtigt werden, wie man bei der Erstellung von Webanwendungen mit verschiedenen Zeitzonen und regionalen Formaten umgeht. Diese Aspekte beeinflussen nicht nur das Layout und die Sprache der Seite, sondern auch, wie Daten wie Datumsangaben, Währungen und Zahlen korrekt dargestellt werden. Bei der Arbeit mit ASP.NET Core ist es daher wichtig, entsprechende Bibliotheken und Tools zu nutzen, um sicherzustellen, dass alle kulturellen und regionalen Unterschiede berücksichtigt werden.

Wie man plattformübergreifend mit .NET und Visual Studio entwickelt

GitHub Codespaces ist eine vollständig konfigurierte Entwicklungsumgebung, die auf Visual Studio Code basiert und in einer Cloud-Umgebung gehostet wird. Über einen Webbrowser kann diese Umgebung von jedem Gerät aus zugänglich gemacht werden. Sie unterstützt Git-Repositories, Erweiterungen und eine integrierte Kommandozeilenoberfläche, sodass man von jedem Gerät aus bearbeiten, ausführen und testen kann. Visual Studio 2022 für Mac eignet sich für die allgemeine Entwicklung, da es die Erstellung der meisten Anwendungen ermöglicht – von Konsolenprogrammen über Webseiten und Webdienste bis hin zu Desktop- und mobilen Anwendungen. Für das Erstellen von Apps für Apple-Betriebssysteme wie iOS, die auf Geräten wie iPhone und iPad laufen, ist jedoch Xcode erforderlich, das ausschließlich auf macOS funktioniert.

Auch Visual Studio 2022 für Windows ist eine vielseitige Entwicklungsplattform, die ebenfalls die Erstellung einer breiten Palette von Anwendungen ermöglicht. Allerdings, um mit .NET MAUI (Multi-platform App UI) plattformübergreifende mobile Apps zu schreiben, ist ebenfalls macOS und Xcode erforderlich, um den Code zu kompilieren. Visual Studio 2022 für Windows läuft ausschließlich auf Windows 10 Version 1909 oder später sowie Windows Server 2016 oder neuer und nur auf 64-Bit-Versionen. Die Version 17.4 unterstützt erstmals native ARM64-Architektur.

Für die Entwicklung und das Testen von Code für dieses Buch habe ich auf folgende Hardware zurückgegriffen: ein HP Spectre (Intel) Laptop, ein Apple Silicon Mac mini (M1) Desktop und einen Raspberry Pi 400 (ARM v8) Desktop. Die Software, die ich verwendete, um diese Entwicklungsumgebungen zu betreiben, umfasste Visual Studio Code sowohl auf macOS als auch auf Windows 11 sowie Visual Studio 2022 für Windows und Mac. Ein Raspberry Pi 400 mit Ubuntu 64-bit bietet auch eine ausgezeichnete Möglichkeit, C#- und .NET-Entwicklung zu erlernen, wie in einem zusätzlichen Artikel auf GitHub beschrieben.

Ein zentraler Aspekt des modernen Softwareentwicklungsprozesses ist die Fähigkeit, auf verschiedenen Plattformen zu entwickeln und Code auf eine Vielzahl von Systemen zu deployen. .NET 7 unterstützt folgende Plattformen für den Einsatz von Anwendungen: Windows (ab Version 1607), macOS (ab Catalina 10.15), Linux (einschließlich Debian, Fedora und Ubuntu ab Version 18.04) sowie mobile Betriebssysteme wie Android (ab API 21) und iOS (ab Version 10). Ein besonders bemerkenswerter Punkt ist, dass Windows ARM64 ab .NET 5 unterstützt wird, sodass Entwickler auf ARM-basierten Geräten wie dem Microsoft Surface Pro X entwickeln und diese auch nutzen können.

Ein weiterer Vorteil der Entwicklung auf einem Apple M1 Mac unter Verwendung von Parallels und einer Windows 11 ARM virtuellen Maschine ist die doppelte Geschwindigkeit im Vergleich zur nativen Hardware. .NET 7 unterstützt keine älteren Windows-Versionen wie Windows 7 oder 8.1, da diese nur mit .NET 6 bis Januar 2023 unterstützt wurden.

Ein häufiges Problem für Entwickler, die mit Visual Studio arbeiten, ist die Auswahl der richtigen Entwicklungsumgebung und -tools. Seit Oktober 2014 stellt Microsoft Visual Studio 2022 für Windows in einer kostenlosen Community Edition zur Verfügung, die sowohl für Studenten als auch für Open-Source-Beiträge und Privatpersonen geeignet ist. Für die Installation von Visual Studio 2022 auf einem Windows-Rechner sollte man die folgenden Schritte befolgen: Von der Microsoft-Website die neueste Version herunterladen, die gewünschten Workloads wie ASP.NET, Azure-Entwicklung und .NET Multi-platform App UI Development auswählen, und sicherstellen, dass Git für Windows als Code-Tool installiert wird. Nach der Installation lässt sich Visual Studio durch ein Microsoft-Konto einrichten, das für die Konfiguration und eine benutzerdefinierte Arbeitsumgebung genutzt werden kann.

Die Installation von Visual Studio Code ist ebenfalls eine lohnenswerte Entscheidung, selbst wenn Visual Studio 2022 bevorzugt wird. Visual Studio Code hat sich in den letzten Jahren stark weiterentwickelt und ist mittlerweile ein unverzichtbares Tool für die Entwicklung von Web- und Datenservices, insbesondere durch Erweiterungen wie den REST Client, den wir in diesem Buch verwenden werden. Die Installation von Visual Studio Code, das .NET SDK und die C#-Erweiterung bieten eine flexible Entwicklungsumgebung, die für eine Vielzahl von Plattformen geeignet ist. Nach der Installation von Visual Studio Code und der C#-Erweiterung ist es wichtig, sich mit den grundlegenden Funktionen vertraut zu machen und sicherzustellen, dass alle benötigten SDKs (wie .NET 6 und .NET 7) korrekt eingerichtet sind. Visual Studio Code bietet zudem eine Vielzahl von Anpassungsmöglichkeiten, um die Arbeitsumgebung optimal auf die eigenen Bedürfnisse abzustimmen.

Ein weiteres wichtiges Thema in der modernen Softwareentwicklung ist der Umgang mit verschiedenen Versionen von .NET SDKs. Die Installation mehrerer SDK-Versionen nebeneinander ist problemlos möglich und wird dringend empfohlen, um sowohl die neueste Version als auch die Long-Term-Support-Version (wie .NET 6) nutzen zu können. Diese Flexibilität ist entscheidend, um Projekte langfristig zu pflegen und sicherzustellen, dass sie auch über die Lebensdauer des Frameworks hinweg stabil bleiben.

Zusammenfassend lässt sich sagen, dass die Auswahl der richtigen Entwicklungsumgebung und der zugehörigen Tools stark davon abhängt, welche Plattformen man unterstützen möchte und welche Art von Anwendungen entwickelt werden sollen. Unabhängig davon, ob man sich für Visual Studio, Visual Studio Code oder eine Kombination aus beiden entscheidet, bieten diese Tools eine robuste Basis für die plattformübergreifende Entwicklung mit .NET.

Wie funktionieren gespeicherte Prozeduren in SQL Server, und welche Rolle spielt Entity Framework Core beim Datenmanagement?

Gespeicherte Prozeduren (Stored Procedures) sind ein mächtiges Werkzeug im SQL Server, das es erlaubt, komplexe Datenbankoperationen vorab zu definieren und zentral auf dem Server auszuführen. Eine typische Prozedur, wie die im Beispiel „GetExpensiveProducts“, akzeptiert Eingabeparameter, verarbeitet Datenbankabfragen und liefert Ergebnisse sowie Output-Parameter zurück. In diesem Fall wird zuerst die Anzahl der Produkte ermittelt, deren Preis über einem definierten Wert liegt, und anschließend werden diese Produkte zurückgegeben. Die Trennung zwischen Ergebnisdatensätzen und Output-Parametern erfordert, dass der Datenleser (DataReader) geschlossen wird, bevor auf die Output-Werte zugegriffen wird. Dies unterstreicht die Bedeutung eines sorgfältigen Managements von Ressourcen und Abläufen bei der Interaktion mit der Datenbank.

Die Verwendung von gespeicherten Prozeduren bringt neben Performance-Vorteilen auch eine klare Trennung von Logik in die Datenbankebene. Entwickler können durch unterschiedliche Ausführungsarten, wie „Text Command“ versus „Stored Procedure“, flexibel auf Anforderungen reagieren und je nach Bedarf die Effizienz oder Wartbarkeit der Anwendung optimieren. Im Kontext von .NET-Programmen wird die Anbindung an solche Prozeduren über das SqlCommand-Objekt gesteuert, das die Parameter richtig definiert und die Ausführung koordiniert. Das Beispiel zeigt, wie sowohl Eingabeparameter als auch Output-Parameter und Rückgabewerte formal in der Programmlogik gehandhabt werden.

Entity Framework Core (EF Core) stellt eine höhere Abstraktionsebene dar, die auf ADO.NET aufsetzt und die Entwicklung erleichtert, indem sie objektorientierte Modelle mit relationalen Datenbanken verbindet. EF Core unterstützt dabei nicht nur klassische relationale Datenbanken, sondern auch moderne NoSQL-Lösungen wie Azure Cosmos DB oder MongoDB über entsprechende Provider. Zwei grundsätzliche Arbeitsweisen prägen den Umgang mit EF Core: Database First, bei dem ein bestehendes Datenbankschema modelliert wird, und Code First, bei dem das Modell zuerst entsteht und dann die Datenbank erzeugt wird. Die Integration von EF Core erleichtert die Pflege der Datenmodelle erheblich, insbesondere wenn diese durch sogenannte „Scaffolding“-Tools automatisiert aus einer bestehenden Datenbank generiert werden. Diese Tools ermöglichen es, den Entwicklungsaufwand zu reduzieren und gleichzeitig die Kontrolle über die Modellklassen zu behalten.

Die Einrichtung und Nutzung von EF Core erfordert den Einsatz spezifischer Kommandozeilenwerkzeuge wie „dotnet-ef“, die Migrationen und Code-Generierung unterstützen. Diese Tools sind nicht standardmäßig installiert und müssen gepflegt sowie auf aktuelle Versionen gebracht werden, um die Kompatibilität mit den Zielversionen von .NET sicherzustellen. Die Modellierung in EF Core beruht auf Konventionen, Attributen und der Fluent API, um eine präzise Abbildung von Datenbanktabellen und deren Beziehungen zu realisieren. Die Konventionen erlauben eine automatische Zuordnung von Klassennamen zu Tabellennamen und von Eigenschaften zu Spalten, was die Entwicklung beschleunigt und zugleich die Wartbarkeit erhöht. Beispielsweise wird angenommen, dass eine Eigenschaft „Id“ oder „ProductId“ als Primärschlüssel fungiert, was die Reduktion redundanter Konfiguration ermöglicht.

Wichtig ist zu verstehen, dass die Effizienz von EF Core gegenüber direktem ADO.NET leicht eingeschränkt sein kann, dafür aber der Entwicklungsaufwand und die Fehleranfälligkeit im Umgang mit Datenbanken reduziert werden. EF Core ist deshalb eine ausgezeichnete Wahl für Anwendungen, bei denen Entwicklungszeit, Wartbarkeit und Erweiterbarkeit im Vordergrund stehen. Dennoch bleibt das Verständnis der zugrundeliegenden SQL-Prozesse und gespeicherten Prozeduren essenziell, um die volle Kontrolle und Performance zu gewährleisten.

Zusätzlich ist zu beachten, dass die Handhabung von Output-Parametern und Rückgabewerten in gespeicherten Prozeduren eine präzise Ablaufsteuerung in der Anwendung erfordert, da erst nach Schließen des Datenlesers auf diese Werte zugegriffen werden kann. Dies kann leicht übersehen werden und führt sonst zu Laufzeitfehlern. Die Kombination aus direkter SQL-Interaktion und EF Core ermöglicht es, je nach Anwendungsfall die optimale Balance zwischen Performance und Entwicklungskomfort zu finden.

Wie funktionieren SQL-Abfragen und serverseitige Programmierung in Azure Cosmos DB?

Azure Cosmos DB ermöglicht das flexible Speichern und Abfragen von NoSQL-Daten mit einem SQL-ähnlichen API, das speziell auf die Anforderungen moderner, skalierbarer Anwendungen zugeschnitten ist. Bei der Arbeit mit Cosmos DB erfolgt die Ausführung von Abfragen und die Manipulation der Daten durch eine Kombination aus clientseitigen SQL-Anfragen und serverseitiger Programmierung, die in JavaScript realisiert wird.

Ein zentrales Element der Datenabfrage sind SQL-Abfragen, die sowohl einfache Selektionen als auch komplexere Operationen wie Filterung, Aggregation und das Abrufen eindeutiger Werte (DISTINCT) unterstützen. Beispielsweise ermöglicht eine Abfrage wie SELECT p.id, p.productName, p.unitPrice FROM Items p WHERE p.unitPrice > 50 das gezielte Auslesen von Produkten, deren Preis eine bestimmte Schwelle übersteigt. Die Ausführung solcher Abfragen in der Azure Cosmos DB-Umgebung, sei es im Emulator oder im Azure-Portal Data Explorer, liefert nicht nur die gewünschten Daten, sondern auch umfangreiche Statistiken zur Leistung, wie etwa den Verbrauch von Request Units (RUs), die Anzahl der zurückgegebenen Datensätze und die Größe der Dokumente. Diese Kennzahlen sind essenziell, um die Effizienz und Kosten von Datenoperationen zu überwachen und zu optimieren.

Darüber hinaus ist die serverseitige Programmierung in Azure Cosmos DB ein mächtiges Werkzeug, um komplexe Geschäftslogiken direkt dort auszuführen, wo die Daten gespeichert sind. Stored Procedures und User Defined Functions (UDFs), die in JavaScript geschrieben werden, bieten dabei entscheidende Vorteile. Stored Procedures garantieren ACID-Konformität, was bedeutet, dass mehrere Einzelschritte in einer Transaktion sicher zusammengefasst werden können, um entweder vollständig ausgeführt oder bei Fehlern komplett zurückgesetzt zu werden. Dies ist bei verteilten NoSQL-Datenbanken sonst schwer zu realisieren und kann nur durch serverseitigen Code gewährleistet werden, da clientseitige Transaktionen nicht unterstützt werden.

UDFs dagegen sind speziell dafür da, innerhalb von SQL-Abfragen benutzerdefinierte Logiken zu implementieren, die in den Standard-SQL-Befehlen nicht verfügbar sind. Ein typisches Beispiel ist die Berechnung von Mehrwertsteuer: Eine Funktion salesTax(unitPrice) multipliziert einfach den Preis mit einem Steuersatz und wird innerhalb der Abfrage referenziert, um neben dem Produktpreis auch den entsprechenden Steuerbetrag zurückzugeben. Diese Integration ermöglicht eine performante und zentralisierte Logik, ohne dass nachgelagerte Berechnungen im Anwendungscode notwendig sind.

Zusätzlich sollte man beachten, dass die Verwaltung und das Bereinigen von Azure Cosmos DB-Ressourcen nach Abschluss der Arbeiten unverzichtbar sind, um unnötige Kosten zu vermeiden. Ressourcen können entweder einzeln oder gruppenweise gelöscht werden. Das Löschen eines Cosmos DB-Kontos entfernt dabei automatisch alle darin enthaltenen Datenbanken und Container.

Neben der Abfrage- und Programmierfunktionalität wird mit APIs wie der Gremlin API auch die Modellierung und Manipulation von Graphdaten unterstützt, was die Flexibilität und Einsatzgebiete von Cosmos DB deutlich erweitert.

Es ist wichtig, dass Nutzer von Azure Cosmos DB nicht nur die Grundlagen der Datenmodellierung und Abfrage verstehen, sondern auch die Bedeutung der Request Units und der Kostensteuerung im Auge behalten. Die Performance von Abfragen hängt stark von der korrekten Partitionierung und Indexierung der Daten ab. Ebenso ist das Verständnis für serverseitige Programmierung essenziell, um ACID-Transaktionen abzubilden und komplexe Logiken effizient umzusetzen. Die Fähigkeit, umfangreiche Statistiken zu interpretieren, hilft dabei, Ressourcen gezielt zu optimieren und die Gesamtbetriebskosten niedrig zu halten.