10 KiB
Poker-Plattform Architektur-Dokumentation
1. Ziel des Projekts
Dieses Projekt ist eine Online-Poker-Plattform als Desktop-Anwendung mit WPF auf dem Client.
Die Anwendung soll mehrere Benutzer unterstuetzen, die sich registrieren, einloggen, Freunde verwalten, private Lobbys erstellen und gemeinsam Texas Hold'em spielen koennen.
Die Architektur ist so ausgelegt, dass sie fuer ein MVP einfach genug bleibt, aber spaeter um weitere Features wie Ranking, Store, Matchmaking, Mini-Chat und erweiterte Profile erweitert werden kann.
2. Hauptanforderungen
Must have
- Registrierung
- Login
- Friendship Request
- Erstellung von privaten Lobbys
- Poker-Gameplay
- vorbereitetes Monetization-System
- Logging-System
- Notification-System
Nice to have
- Ranking-System
- Mini-Chat
- App-Settings
- Matchmaking
- Advanced Profile
- Store
3. Technologie-Stack
Client
WPFSignalR Client
Server
ASP.NET CoreSignalR- C# Service- und Business-Logik
Datenzugriff
ADO.NETMicrosoft.Data.SqlClient
Datenbank
SQL Server
4. Grundidee der Architektur
Die Anwendung besteht aus drei Hauptteilen:
WPF ClientServerprozessSQL Server
4.1 WPF Client
Der Client ist nur fuer die Darstellung und Benutzerinteraktion verantwortlich.
Aufgaben des Clients:
- Login- und Registrierungsoberflaechen anzeigen
- Freundesliste und Freundschaftsanfragen darstellen
- private Lobbys anzeigen und verwalten
- Pokertisch visualisieren
- Spieleraktionen an den Server senden
- Benachrichtigungen live anzeigen
Der Client darf keine kritischen Spielregeln selbst kontrollieren.
Er zeigt nur Daten an und sendet Benutzerabsichten wie Raise, Call, Fold oder Lobby erstellen.
4.2 Serverprozess
Der Serverprozess ist das zentrale Gehirn der Anwendung.
Er enthaelt:
- Session-Logik
- Social-Logik
- Lobby-Logik
- Poker-Logik
- Notification-Logik
- Logging-Logik
- Repository-Zugriffe auf SQL Server
Der Server:
- nimmt Anfragen vom Client entgegen
- prueft Regeln und Berechtigungen
- liest und schreibt Daten in SQL Server
- sendet Live-Updates ueber SignalR an alle relevanten Clients
4.3 SQL Server
SQL Server speichert den dauerhaften Zustand der Anwendung.
Dazu gehoeren:
- Benutzer
- Sessions
- Freundschaften
- Lobbys
- Pokerhaende
- Handaktionen
- Notifications
- Wallet-Daten
- Logs
5. Warum kein direkter Vollzugriff des Clients auf die Datenbank?
Auch wenn eine WPF-App technisch direkt mit einer Connection String an SQL Server verbunden werden kann, ist das fuer ein Online-Poker-System nicht die beste Loesung.
Gruende:
- Spielregeln koennen sonst leichter umgangen werden
- Sicherheitslogik waere im Client sichtbar
- Benutzer koennten gezielt Requests manipulieren
- Turn-Order und Anti-Cheat werden schwieriger
- Live-Funktionen wie Lobby-Updates und Notifications brauchen ohnehin einen Server
Deshalb gilt in diesem Projekt:
WPFist der ClientASP.NET Core + SignalRist der ServerteilADO.NETverbindet den Server mitSQL Server
6. Geplante Solution-Struktur
Empfohlene Projektaufteilung:
Poker.Client
WPF-Anwendung mit:
- Views
- ViewModels
- Client-Services fuer SignalR
- UI-State
Poker.Server
ASP.NET-Core-Anwendung mit:
- REST-Endpunkten fuer normale Operationen
- SignalR-Hubs fuer Echtzeitkommunikation
- Services fuer Geschaeftslogik
Poker.Core
Klassenbibliothek fuer Business-Logik:
- Poker-Regeln
- Lobby-Regeln
- Social-Regeln
- Session-Regeln
- Notification-Regeln
Diese Schicht soll moeglichst unabhaengig von UI und SQL bleiben.
Poker.Data
Klassenbibliothek fuer Datenzugriff:
SqlConnectionFactory- Repositories
- SQL-Statements
- Mapper
- Transaktionslogik
Poker.Contracts
Gemeinsame DTOs und SignalR-Modelle zwischen Client und Server.
7. Schichtenmodell
Client-Seite
WPF UI
-> ViewModel
-> Client Service
-> SignalR / HTTP
Server-Seite
Hub / Controller
-> Application Service
-> Domain Logic
-> Repository
-> SQL Server
8. Feature-Bereiche
8.1 Registrierung und Login
Der Benutzer kann:
- ein Konto erstellen
- sich einloggen
- eine Session erhalten
Serverseitige Aufgaben:
- Benutzername und E-Mail pruefen
- Passwort sicher hashen
- Session erzeugen
- Login-Audit loggen
Empfohlene Tabellen:
UsersUserSessions
8.2 Friendship Requests
Ein Benutzer kann:
- einen anderen Benutzer als Freund anfragen
- Anfrage annehmen
- Anfrage ablehnen
- Freund entfernen
Serverseitige Regeln:
- keine Selbstanfrage
- keine doppelten offenen Anfragen
- keine doppelte Freundschaft
Empfohlene Tabellen:
FriendRequestsFriendships
8.3 Private Lobby
Der Benutzer kann:
- eine private Lobby erstellen
- Freunde einladen
- einer Einladung folgen
- die Lobby verlassen
Der Host kann:
- Spiel starten
- Lobby schliessen
- Spieler verwalten
Empfohlene Tabellen:
LobbiesLobbyMembersLobbyInvites
8.4 Poker
Poker wird serverautoritativ umgesetzt.
Das bedeutet:
- der Client schlaegt nur Aktionen vor
- der Server entscheidet, ob die Aktion erlaubt ist
- der Server aktualisiert die Hand
- der Server broadcastet den neuen Zustand
Erste Variante:
No-Limit Texas Hold'em Cash Game
Wichtige Regeln:
- korrekte Zugreihenfolge
- Blind-Struktur
- gueltige Aktionen pro Runde
- Pot-Berechnung
- Showdown
Empfohlene Tabellen:
TablesHandsHandPlayersHandActions
8.5 Logging-System
Es werden zwei Arten von Logging unterschieden:
Technisches Logging
Fuer Fehler, Exceptions, Performance und Diagnose.
Fachliches Logging / Audit Logging
Fuer wichtige Benutzer- und Spielfluss-Ereignisse:
- Registrierung
- Login
- Freundschaftsanfrage
- Lobby erstellt
- Lobby beigetreten
- Spiel gestartet
- Pokeraktion ausgefuehrt
Empfohlene Tabelle:
AppLogs
8.6 Notification-System
Benachrichtigungen werden in Echtzeit ueber SignalR verschickt und zusaetzlich in SQL gespeichert.
Anwendungsfaelle:
- Freundschaftsanfrage erhalten
- Freundschaftsanfrage angenommen
- Lobby-Einladung erhalten
- Lobby-Status geaendert
- Systemmeldung
Empfohlene Tabelle:
Notifications
8.7 Monetization-System
Im MVP wird Monetization nur vorbereitet.
Das bedeutet:
- Soft Currency / Wallet-Struktur wird angelegt
- Katalog und Kaufhistorie koennen spaeter erweitert werden
- noch kein voller Store im ersten Release
Empfohlene Tabellen:
Wallets- spaeter
CatalogItems - spaeter
Purchases - spaeter
InventoryItems
9. Kommunikationsarten
9.1 REST / HTTP
Wird fuer normale fachliche Operationen verwendet, die kein permanentes Live-Streaming brauchen.
Beispiele:
- Registrierung
- Login
- Freundesliste laden
- Lobby erstellen
- Profil laden
- Settings speichern
9.2 SignalR
Wird fuer Echtzeitkommunikation verwendet.
Beispiele:
- Poker-Zuege
- Lobby-Updates
- Online-Status
- Notifications
10. Warum trotzdem HTTP/REST auch bei einer Desktop-App?
Eine Desktop-App braucht kein Web-Frontend, kann aber trotzdem mit einem Server ueber HTTP sprechen.
Wichtig:
POSTundGEThaben nichts mit Web-App oder Browser zu tun- sie werden nur dann gebraucht, wenn der Client mit einem Server kommuniziert
In diesem Projekt ist das sinnvoll fuer:
- Registrierung
- Login
- Daten laden
- einfache CRUD-Vorgaenge
SignalR ist zusaetzlich fuer Live-Kommunikation da.
11. ADO.NET Repository-Schicht
Die Datenbankzugriffe werden explizit mit ADO.NET umgesetzt.
Verwendete Klassen:
SqlConnectionSqlCommandSqlDataReaderSqlTransaction
Wichtige Prinzipien:
- nur parametrisierte SQL-Statements
- keine Business-Logik in Repository-Klassen
- jede komplexe Spielaenderung in einer Transaktion
- Mapper trennen SQL-Daten von Domain-Objekten
Beispielhafte Klassen:
SqlConnectionFactoryUserRepositorySessionRepositoryFriendshipRepositoryLobbyRepositoryHandRepositoryNotificationRepositoryWalletRepository
12. SignalR-Hubs
PokerHub
Zustaendig fuer:
- Tischstatus senden
- Aktionen empfangen
- Spiel-Updates broadcasten
LobbyHub
Zustaendig fuer:
- Lobby-Status
- Beitritt / Austritt
- Einladungen
- Spielstart
NotificationHub
Zustaendig fuer:
- persoenliche Benutzer-Benachrichtigungen
13. SQL-Server-Datenmodell
Pflichttabellen
UsersUserSessionsFriendRequestsFriendshipsLobbiesLobbyMembersLobbyInvitesTablesHandsHandPlayersHandActionsNotificationsWalletsAppLogs
Wichtige SQL-Regeln
- IDs als
BIGINT - Geld- und Chipwerte als
INT - Zeitstempel als
DATETIME2 - Indizes auf haeufig gesuchte Felder
- Poker-Aktionen immer in
SqlTransaction
14. Sicherheitsprinzipien
- Passwort nie im Klartext speichern
- Hashing mit sicherem Verfahren wie
PBKDF2oderBCrypt - keine DB-Credentials im Client hart codieren
- keine kritischen Spielregeln im Client erzwingen
- jede Spieleraktion serverseitig validieren
- Sessions zeitlich begrenzen
- Logging fuer sicherheitsrelevante Aktionen
15. Erweiterbarkeit fuer spaetere Features
Die Architektur wird so vorbereitet, dass diese Features spaeter sauber ergaenzt werden koennen:
- Ranking-System
- Mini-Chat
- App-Settings
- Matchmaking
- Advanced Profile
- Store
Dafuer werden Datenmodell und Service-Grenzen so definiert, dass spaetere Erweiterungen nicht zu einem kompletten Umbau fuehren.
16. Empfohlene Entwicklungsreihenfolge
Phase 1
- Solution aufsetzen
- SQL-Schema anlegen
- ADO.NET Basis
- Benutzer und Sessions
Phase 2
- Registrierung und Login
- Logging-Basis
- Friendship Requests
Phase 3
- private Lobby
- Lobby-Invites
- Notification-System
Phase 4
- Poker-Spielregeln
- Hand- und Aktionspersistenz
- PokerHub
Phase 5
- Wallet-Basis
- vorbereitete Monetization-Struktur
Phase 6
- Nice-to-have-Features vorbereiten oder schrittweise umsetzen
17. Kurzfazit
Die empfohlene Architektur fuer dieses Projekt lautet:
WPFfuer den ClientASP.NET Core + SignalRfuer den ServerprozessADO.NETfuer die DatenbankzugriffeSQL Serverfuer dauerhafte Speicherung
Damit bekommst du:
- klare Trennung von UI, Logik und Daten
- saubere Grundlage fuer Online-Multiplayer
- gute Erweiterbarkeit
- Kontrolle ueber SQL und Datenfluss
Diese Architektur ist fuer dein Projekt deutlich sinnvoller als ein reiner Direktzugriff des WPF-Clients auf die Datenbank, weil Social-, Lobby-, Notification- und Poker-Logik zentral und sicherer gesteuert werden koennen.