CQRS (Command Query Responsibility Segregation) και MediatR Pattern στη C#
1️⃣ Τι είναι το CQRS; Το CQRS (Command Query Responsibility Segregation) είναι ένα αρχιτεκτονικό pattern που διαχωρίζει τις λειτουργίες ανάγνωσης (Query) από τις λειτουργίες εγγραφής (Command). Ο σκοπός του είναι να επιτρέπει το σύστημα να διαχειρίζεται τις εγγραφές και τις αναγνώσεις δεδομένων ανεξάρτητα, βελτιώνοντας την απόδοση, την επεκτασιμότητα και τη συντήρηση. Βασικές Αρχές του CQRS: ✔ Command: Χρησιμοποιείται για την τροποποίηση της κατάστασης του συστήματος (π.χ., δημιουργία, ενημέρωση, διαγραφή). ✔ Query: Χρησιμοποιείται για την ανάκτηση δεδομένων χωρίς να μεταβάλλει την κατάσταση. ✔ Separation of Concerns: Οι αναγνώσεις και οι εγγραφές δεν χρησιμοποιούν το ίδιο data model. 2️⃣ Τι είναι το MediatR Pattern; Το MediatR είναι μια βιβλιοθήκη στη C# που εφαρμόζει το Mediator Pattern, επιτρέποντας την επικοινωνία μεταξύ των αντικειμένων χωρίς να χρειάζεται να είναι άμεσα συνδεδεμένα. Αυτό προάγει τη χαλαρή σύζευξη (loose coupling) και βελτιώνει τη δομή του κώδικα. Οφέλη του MediatR: ✅ Απομάκρυνση των άμεσων εξαρτήσεων μεταξύ αντικειμένων. ✅ Καθαρός και δομημένος κώδικας με διαχωρισμό ευθυνών. ✅ Εύκολη επέκταση με νέες λειτουργίες χωρίς να επηρεάζονται άλλα κομμάτια του κώδικα. 3️⃣ Εφαρμογή του CQRS με MediatR στη C# Βήμα 1: Εγκατάσταση του MediatR Χρησιμοποιούμε το NuGet package manager για να εγκαταστήσουμε το MediatR: Install-Package MediatR Install-Package MediatR.Extensions.Microsoft.DependencyInjection Βήμα 2: Ορισμός του Command (Εγγραφή/Τροποποίηση Δεδομένων) Ένα Command χρησιμοποιείται για να εκτελέσει μια ενέργεια που τροποποιεί το σύστημα. Δημιουργούμε ένα request που αντιπροσωπεύει την εντολή. Παράδειγμα: Δημιουργία χρήστη (CreateUserCommand) public record CreateUserCommand(string Name, string Email) : IRequest; Το IRequest σημαίνει ότι αυτή η εντολή επιστρέφει έναν ακέραιο αριθμό (π.χ., το Id του νέου χρήστη). Βήμα 3: Υλοποίηση του Handler για το Command public class CreateUserCommandHandler : IRequestHandler { private readonly ApplicationDbContext _dbContext; public CreateUserCommandHandler(ApplicationDbContext dbContext) { _dbContext = dbContext; } public async Task Handle(CreateUserCommand request, CancellationToken cancellationToken) { var user = new User { Name = request.Name, Email = request.Email }; _dbContext.Users.Add(user); await _dbContext.SaveChangesAsync(cancellationToken); return user.Id; } }

1️⃣ Τι είναι το CQRS;
Το CQRS (Command Query Responsibility Segregation) είναι ένα αρχιτεκτονικό pattern που διαχωρίζει τις λειτουργίες ανάγνωσης (Query) από τις λειτουργίες εγγραφής (Command). Ο σκοπός του είναι να επιτρέπει το σύστημα να διαχειρίζεται τις εγγραφές και τις αναγνώσεις δεδομένων ανεξάρτητα, βελτιώνοντας την απόδοση, την επεκτασιμότητα και τη συντήρηση.
Βασικές Αρχές του CQRS:
✔ Command: Χρησιμοποιείται για την τροποποίηση της κατάστασης του συστήματος (π.χ., δημιουργία, ενημέρωση, διαγραφή).
✔ Query: Χρησιμοποιείται για την ανάκτηση δεδομένων χωρίς να μεταβάλλει την κατάσταση.
✔ Separation of Concerns: Οι αναγνώσεις και οι εγγραφές δεν χρησιμοποιούν το ίδιο data model.
2️⃣ Τι είναι το MediatR Pattern;
Το MediatR είναι μια βιβλιοθήκη στη C# που εφαρμόζει το Mediator Pattern, επιτρέποντας την επικοινωνία μεταξύ των αντικειμένων χωρίς να χρειάζεται να είναι άμεσα συνδεδεμένα. Αυτό προάγει τη χαλαρή σύζευξη (loose coupling) και βελτιώνει τη δομή του κώδικα.
Οφέλη του MediatR:
✅ Απομάκρυνση των άμεσων εξαρτήσεων μεταξύ αντικειμένων.
✅ Καθαρός και δομημένος κώδικας με διαχωρισμό ευθυνών.
✅ Εύκολη επέκταση με νέες λειτουργίες χωρίς να επηρεάζονται άλλα κομμάτια του κώδικα.
3️⃣ Εφαρμογή του CQRS με MediatR στη C#
Βήμα 1: Εγκατάσταση του MediatR
Χρησιμοποιούμε το NuGet package manager για να εγκαταστήσουμε το MediatR:
Install-Package MediatR
Install-Package MediatR.Extensions.Microsoft.DependencyInjection
Βήμα 2: Ορισμός του Command (Εγγραφή/Τροποποίηση Δεδομένων)
Ένα Command χρησιμοποιείται για να εκτελέσει μια ενέργεια που τροποποιεί το σύστημα. Δημιουργούμε ένα request που αντιπροσωπεύει την εντολή.
Παράδειγμα: Δημιουργία χρήστη (CreateUserCommand)
public record CreateUserCommand(string Name, string Email) : IRequest;
Το IRequest σημαίνει ότι αυτή η εντολή επιστρέφει έναν ακέραιο αριθμό (π.χ., το Id του νέου χρήστη).
Βήμα 3: Υλοποίηση του Handler για το Command
public class CreateUserCommandHandler : IRequestHandler
{
private readonly ApplicationDbContext _dbContext;
public CreateUserCommandHandler(ApplicationDbContext dbContext)
{
_dbContext = dbContext;
}
public async Task Handle(CreateUserCommand request, CancellationToken cancellationToken)
{
var user = new User { Name = request.Name, Email = request.Email };
_dbContext.Users.Add(user);
await _dbContext.SaveChangesAsync(cancellationToken);
return user.Id;
}
}