Die Struktur einer .NET MAUI-Anwendung beginnt häufig mit der Definition der Hauptseite in der App.xaml.cs, wo die Eigenschaft MainPage auf eine Instanz von AppShell gesetzt wird. AppShell dient als zentrales Navigationsgerüst und kann durch das Hinzufügen mehrerer Inhaltsseiten die Benutzerführung der App organisieren. Wird im Shell jedoch nur eine einzige Inhaltsseite definiert, bleibt die Navigation unsichtbar, da mindestens zwei Shell-Content-Elemente erforderlich sind, um Navigationsoptionen im Flyout anzuzeigen.
Um ein intuitives und visuell ansprechendes Flyout-Menü zu realisieren, müssen zunächst geeignete Icons in das Projekt eingebunden werden. Dies erfolgt durch das Einfügen von Bilddateien in den Ressourcenordner unter Resources/Images. Diese Icons können anschließend im AppShell.xaml als Symbole für die Flyout-Elemente verwendet werden. Das Flyout selbst wird durch Setzen entsprechender Eigenschaften wie FlyoutBehavior auf Flyout aktiviert, während Designaspekte wie Hintergrundfarben das visuelle Erlebnis verbessern.
Die Erweiterung der App mit weiteren ContentPages erfolgt durch das Hinzufügen neuer XAML-Seiten im Projekt, beispielsweise CategoriesPage.xaml, EmployeesPage.xaml oder CustomersPage.xaml. Jede dieser Seiten erhält einen eigenen Titel und individuelle Inhalte, die über XAML definiert werden. Die Bearbeitung erfolgt im Quelltext, da Visual Studio 2022 noch keine grafische Designansicht für MAUI XAML anbietet. Die Integration von Steuerelementen, wie Buttons, geschieht über Drag & Drop aus der Toolbox oder direkt im XAML-Code.
Ein praktisches Beispiel ist die Modifikation eines Buttons, dessen Text sich dynamisch ändert. Nach dem Hinzufügen des Buttons in der CategoriesPage.xaml und der Zuweisung eines Namens, beispielsweise ClickMeButton, kann ein Event-Handler für das Clicked-Ereignis definiert werden. Innerhalb dieses Handlers wird der Text des Buttons programmatisch auf die aktuelle Uhrzeit gesetzt, was die Interaktivität der Anwendung demonstriert. Die Anwendung von XAML Hot Reload erlaubt dabei die unmittelbare Vorschau von Änderungen, ohne dass die App neu gestartet werden muss, was den Entwicklungsprozess deutlich beschleunigt.
Bei der Entwicklung sollte beachtet werden, dass beim Einsatz von Emulatoren oder Simulatoren ältere App-Versionen noch im Hintergrund laufen können. Es ist daher ratsam, die vollständige Bereitstellung der neuen Version abzuwarten, was durch Statusanzeigen in Visual Studio angezeigt wird.
Der modulare Aufbau der App mit mehreren Seiten ermöglicht nicht nur eine übersichtliche Navigation, sondern auch eine flexible Erweiterung der Funktionalität. So kann zum Beispiel auf der Seite EmployeesPage.xaml ein einfaches Taschenrechner-Interface implementiert werden, das eigenständige Benutzerinteraktionen ermöglicht.
Wichtig ist das Verständnis, dass AppShell als zentrales Navigationselement nicht nur die visuelle Navigation steuert, sondern auch die Interaktion zwischen den einzelnen Seiten orchestriert. Die richtige Konfiguration der Shell-Elemente ist essenziell, um ein konsistentes und benutzerfreundliches Navigationssystem zu gewährleisten. Darüber hinaus sorgt die Verwendung von XAML und MVVM-Architekturen für eine klare Trennung von Design und Logik, was die Wartbarkeit und Erweiterbarkeit der Anwendung verbessert.
Das Zusammenspiel von Ressourcenmanagement, Navigation und Event-Handling bildet die Grundlage für die Erstellung moderner, responsiver Anwendungen mit .NET MAUI. Für den Leser ist es entscheidend, diese Zusammenhänge nicht isoliert, sondern im Kontext des gesamten App-Designs zu sehen, um robuste und intuitive Benutzeroberflächen zu entwickeln.
Wie man eine Azure SQL-Datenbank mit Visual Studio und Docker verwaltet
Um mit einer Azure SQL-Datenbank zu arbeiten, gibt es mehrere mögliche Ansätze, je nach den verfügbaren Ressourcen und Präferenzen des Entwicklers. Einer der einfachsten Wege, eine Verbindung zu einer Azure SQL-Datenbank herzustellen, besteht darin, Visual Studio zu verwenden. In diesem Abschnitt wird beschrieben, wie man eine Azure SQL-Datenbank in Visual Studio verbindet und wie man Daten mit Transact-SQL (T-SQL) verwaltet.
Zunächst benötigen Sie eine gültige Verbindung zu einer Azure SQL-Datenbank. Dazu müssen Sie im Verbindungshinweis den Servernamen und die erforderlichen Zugangsdaten korrekt eingeben. Beispielhafte Verbindungszeichenfolgen sind wie folgt:
Der Servername wird in diesem Fall durch "apps-services-net7" dargestellt, der öffentlich und global eindeutig sein muss. Das bedeutet, dass jeder Entwickler seine eigene, individuelle Serverbezeichnung in der Verbindungszeichenfolge angeben muss.
Nachdem die Verbindungsdetails eingegeben wurden, öffnen Sie Ihr bevorzugtes Datenbanktool. Für Visual Studio 2022 finden Sie dies im Bereich "Server Explorer", während Sie für Windows-Systeme auch das SQL Server Management Studio verwenden können. Falls Sie Visual Studio Code nutzen, benötigen Sie das SQL Server Tool, das durch die mssql-Erweiterung ergänzt werden kann. Dies ist auch für plattformübergreifende Nutzung wichtig, weshalb sich Azure Data Studio als nützlich erweist.
In Visual Studio müssen Sie die Verbindung zur Azure SQL-Datenbank herstellen, indem Sie in der Server Explorer-Ansicht auf „Datenquelle auswählen“ klicken und Microsoft SQL Server als Quelle wählen. Nach dem Verbinden können Sie mit der Erstellung von SQL-Abfragen fortfahren, indem Sie mit der rechten Maustaste auf die Datenquelle klicken und „Neue Abfrage“ wählen.
Um mit einer vollständig konfigurierten Datenbank zu arbeiten, müssen Sie den SQL-Skriptabgleich durchführen. Kopieren Sie dazu den Inhalt des „Northwind4AzureSQLdatabase.sql“-Skripts in das Abfragefenster und führen Sie es aus. Das Besondere bei der Azure SQL-Datenbank ist, dass beim Ausführen dieses Skripts die Datenbank nicht gelöscht und neu erstellt wird, wie es bei einer lokalen SQL-Server-Datenbank der Fall wäre. Stattdessen handelt es sich um eine Bereitstellung in Azure, wo die Datenbank als Ressource verwaltet wird. Wenn die Ausführung erfolgreich war, sehen Sie eine Bestätigungsmeldung und eine vollständige Datenbankstruktur mit Tabellen und gespeicherten Prozeduren.
Azure SQL Edge in Docker
Nicht jeder Entwickler hat Zugang zu einer Windows-Umgebung oder möchte die kostenpflichtigen Azure-Ressourcen nutzen. In diesem Fall kann Azure SQL Edge eine Lösung sein, die lokal auf Docker ausgeführt wird. Azure SQL Edge ist eine minimale Version von SQL Server, die auf Docker betrieben wird und nur den Datenbank-Engine enthält. Es handelt sich dabei um eine plattformübergreifende Lösung, die sowohl auf Linux- als auch Mac- und Windows-Systemen funktioniert.
Um Azure SQL Edge in Docker zu installieren, müssen Sie zunächst Docker auf Ihrem System einrichten. Nachdem Docker installiert ist, können Sie das neueste Container-Image für Azure SQL Edge mit dem folgenden Befehl herunterladen:
Nachdem das Image erfolgreich heruntergeladen wurde, starten Sie den Container mit dem Befehl:
Achten Sie darauf, dass das Passwort mindestens 8 Zeichen lang sein muss und Zeichen aus mindestens drei der vier folgenden Gruppen enthalten muss: Großbuchstaben, Kleinbuchstaben, Ziffern und Symbole. Andernfalls kann der Container die SQL Edge Engine nicht einrichten.
Sobald der Container läuft, können Sie über Visual Studio, SQL Server Management Studio oder Azure Data Studio eine Verbindung herstellen und Abfragen ausführen. Um sicherzustellen, dass der Docker-Container läuft, können Sie den Befehl docker ps -a verwenden, um den Status der Container zu prüfen. Wenn der Container ordnungsgemäß läuft, sehen Sie eine entsprechende Ausgabe mit dem Status "Up" und dem externen Port 1433, der mit dem internen Port des Containers verbunden ist.
Transact-SQL und seine Anwendung
Transact-SQL (T-SQL) ist die Erweiterung des SQL-Standards, die speziell von Microsoft für SQL Server entwickelt wurde. T-SQL bietet zusätzliche Funktionen wie Fehlerbehandlung, Variablen und Programmierschleifen, die über den reinen SQL-Standard hinausgehen. In T-SQL sind die Datentypen nicht case-sensitive, was bedeutet, dass int und INT dasselbe sind. Diese Flexibilität gilt auch für SQL-Schlüsselwörter wie SELECT und select.
Die grundlegenden T-SQL-Datentypen umfassen numerische Typen wie int, decimal und money, Zeittypen wie datetime und date, sowie Texttypen wie varchar, nvarchar und text. Darüber hinaus unterstützt T-SQL auch spezielle Typen wie uniqueidentifier und xml, die in speziellen Anwendungsfällen verwendet werden.
Kommentare in T-SQL können auf zwei Arten gemacht werden: Einzeilige Kommentare beginnen mit --, während Blockkommentare mit /* beginnen und mit */ enden. Dies entspricht der Syntax, die auch in anderen Programmiersprachen wie C# verwendet wird.
Variablen werden in T-SQL mit dem Präfix @ deklariert und können mit den Befehlen SET, SELECT oder DECLARE initialisiert werden. Hier ein einfaches Beispiel:
Diese Variablen können dann in SQL-Abfragen verwendet werden, um flexible und dynamische Abfragen zu ermöglichen.
Wichtige Aspekte, die beim Arbeiten mit SQL-Servern und Datenbanken berücksichtigt werden sollten, umfassen die Verwaltung von Verbindungen und die Verwendung sicherer Passwörter. Auch die Fähigkeit, mit verschiedenen Datenbanktools zu arbeiten und das Verständnis der Unterschiede zwischen lokalen und Azure SQL-Datenbanken sind entscheidend für die effektive Arbeit mit relationalen Datenbanken.
Wie man gRPC in einer .NET-Anwendung mit EF Core und MVC implementiert
Die Entwicklung von effizienten Microservices ist heutzutage ein zentrales Thema in der Softwareentwicklung. Besonders in Umgebungen, die auf schnelle und skalierbare Interaktionen angewiesen sind, bietet gRPC eine hervorragende Möglichkeit, die Kommunikation zwischen Microservices zu optimieren. In diesem Abschnitt werden wir untersuchen, wie man gRPC in einer .NET-Anwendung mit EF Core integriert und einen Microservice aufbaut, der auf eine relationale Datenbank zugreift.
Ein entscheidender Schritt in der Entwicklung eines gRPC-Services besteht darin, zunächst ein .proto-File zu definieren, das als Vertrag zwischen dem Client und dem Server fungiert. Dieses File beschreibt die Datenstrukturen und die Methoden, die der Service bereitstellt. In unserem Beispiel bauen wir einen Service, der Informationen über „Shipper“ aus der Northwind-Datenbank liefert.
Der erste Schritt ist, die .proto-Datei zu erstellen. Dies kann im Visual Studio unter Verwendung des Templates „Protocol Buffer File“ erfolgen. In dieser Datei definieren wir die benötigten Nachrichten und den Service, wie im folgenden Beispiel gezeigt:
Im nächsten Schritt fügen wir das gRPC-Projekt in das Hauptprojekt ein, das auf die Northwind-Datenbank zugreift. Dazu referenzieren wir das EF Core-Modell, das in einem früheren Kapitel erstellt wurde, und stellen sicher, dass die gRPC-Service-Methoden mit den entsprechenden Datenbankoperationen verbunden sind.
Der Service selbst wird durch die Implementierung einer Klasse ShipperService definiert, die das Interface von gRPC implementiert. Diese Klasse verwendet das Entity Framework (EF) Core, um mit der Datenbank zu interagieren und die erforderlichen Informationen über die „Shipper“ zurückzugeben. Das folgende Beispiel zeigt die Implementierung einer einfachen Methode GetShipper, die einen einzelnen „Shipper“ anhand seiner ID abruft:
Das Proto-File erzeugt Klassen, die die Nachrichten darstellen, die zwischen dem gRPC-Service und dem Client gesendet werden. Da wir jedoch die Entity-Klassen aus dem EF Core-Modell nicht direkt verwenden können, benötigen wir eine Hilfsmethode wie ToShipperReply, um die Entitäten in die gRPC-Nachrichten umzuwandeln.
Sobald der gRPC-Service definiert ist, wird dieser im Program.cs registriert. In der Konfiguration des HTTP-Pipelines wird ein zusätzlicher Schritt eingefügt, um den ShipperService zu registrieren:
Im nächsten Schritt geht es darum, den gRPC-Client im MVC-Projekt zu integrieren. Der Client stellt eine Verbindung zum gRPC-Service her und kann die Methode GetShipper aufrufen, um die Daten über einen Shipper zu erhalten. Dazu wird die .proto-Datei ebenfalls in das MVC-Projekt eingefügt, und die gRPC-Client-Services werden so konfiguriert, dass sie mit dem Server kommunizieren.
Die Konfiguration des Clients erfolgt wie folgt, wobei der gRPC-Client mit dem entsprechenden Endpunkt auf dem Server verbunden wird:
Im HomeController.cs des MVC-Projekts fügen wir dann eine Methode hinzu, um die gRPC-Client-Methoden aufzurufen und die Daten an die View zu übergeben:
Hierbei handelt es sich um eine einfache Implementierung eines gRPC-Clients, der die Daten von einem Microservice abruft und diese im Frontend anzeigt.
Es ist von wesentlicher Bedeutung, dass beim Design von Microservices, insbesondere bei der Integration von gRPC, der Fokus auf Skalierbarkeit und Leistung gelegt wird. Die Verwendung von gRPC statt RESTful-APIs kann die Kommunikation erheblich beschleunigen, insbesondere in hochgradig verteilten Systemen, wo geringe Latenzzeiten und hohe Durchsatzraten entscheidend sind. Darüber hinaus sollte die Architektur von gRPC-Services gut durchdacht sein, um eine effiziente Fehlerbehandlung und Protokollierung zu gewährleisten, wie es im obigen Beispiel durch den Einsatz von ILogger und Fehlerbehandlungsroutinen demonstriert wird.
Es ist ebenfalls wichtig, dass man sich der Unterschiede zwischen den gRPC-Nachrichtentypen und den Entity-Klassen von EF Core bewusst ist. Während Entity-Klassen direkt mit der Datenbank interagieren, sind gRPC-Nachrichtentypen strikt an den Kommunikationsprozess zwischen Client und Server gebunden. Eine ordnungsgemäße Abstraktion und Mapping-Strategie ist notwendig, um fehlerfreie und effiziente Interaktionen zu gewährleisten.
Wie können wir uns von der Dominanz der Vergangenheit und Zukunft befreien und in den gegenwärtigen Moment eintauchen?
Wie prägte der Wettlauf ins All die Geschichte und das menschliche Bewusstsein?
Wie sah die mittelalterliche Welt den Beginn moderner Wissenschaft und Technik?
Wie findet man eine Jordan-Normalform und warum ist ihre Einzigartigkeit entscheidend?

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский