Χρησιμοποιήστε το μοτίβο CQRS με προσοχή και μπορείτε να δημιουργήσετε πιο καθαρές, πιο επεκτάσιμες εφαρμογές Nest.
Μια κοινή προσέγγιση για την ανάπτυξη του NestJS είναι η δημιουργία υπηρεσιών με τις οποίες επικοινωνούν οι ελεγκτές για πρόσβαση σε δεδομένα. Αλλά αυτή η προσέγγιση δεν είναι το μόνο έγκυρο μοτίβο σχεδίασης στο NestJS. Υπάρχουν και άλλα σχέδια σχεδίασης, όπως το σχέδιο σχεδίασης CQRS.
Το CQRS είναι ένα σχέδιο σχεδίασης που διαχωρίζει τις λειτουργίες ανάγνωσης και εγγραφής μιας εφαρμογής. Αυτός ο διαχωρισμός μπορεί να βοηθήσει στη βελτίωση της επεκτασιμότητας, της απόδοσης και της δυνατότητας συντήρησης.
Μάθετε τα πάντα για το CQRS και πώς μπορείτε να το εφαρμόσετε κατά τη δημιουργία ενός NestJS API.
Τι είναι το CQRS;
CQRS σημαίνει διαχωρισμός ευθύνης εντολής-ερώτησης. Υλοποιεί τη χρήση του εντολές για δημιουργία, ενημέρωση και διαγραφή δεδομένων και ερωτήματα για ανάκτηση δεδομένων. Αυτό βοηθά στην εξάλειψη της ανάγκης εφαρμογής κλήσεων της βάσης δεδομένων μιας εφαρμογής σε υπηρεσίες.
Επιτρέπει επίσης μια σαφή διάκριση μεταξύ της λογικής της αναζήτησης δεδομένων στη βάση δεδομένων και της εκτέλεσης άλλων ενεργειών σε μια εφαρμογή.
Η προσέγγιση CQRS είναι χρήσιμη σε σχεδιασμός με γνώμονα τον τομέα, το οποίο σας επιτρέπει να διαχωρίσετε τη λογική τομέα και τις λειτουργίες υποδομής στην εφαρμογή σας. Μπορείτε επίσης να το χρησιμοποιήσετε για να εφαρμόσετε πολύπλοκη επιχειρηματική λογική, αλλά αυτό δεν συνιστάται για απλούστερες εφαρμογές.
Χρήση CQRS σε ένα NestJS API
Μπορείτε να χρησιμοποιήσετε το μοτίβο σχεδίασης CQRS σε ένα API που δημιουργείτε στο NestJS. Για να ακολουθήσετε, πρέπει να έχετε Το Node.js είναι εγκατεστημένο στον υπολογιστή σας και μια πρόσφατη έκδοση του NestJS.
Χρησιμοποιήστε τα παρακάτω βήματα για να δημιουργήσετε μια απλή εφαρμογή blogging που εφαρμόζει το μοτίβο σχεδίασης CQRS.
Δημιουργήστε ένα έργο Nest
Δημιουργήστε ένα νέο έργο Nest και δημιουργήστε ένα Θέση πόρος για μια εφαρμογή ιστολογίου. Μπορείτε να το κάνετε αυτό εκτελώντας τις ακόλουθες εντολές σε ένα τερματικό:
φωλιάζει νέο nestjs-cqrs
nest g θέσεις ενότητας
nest g στύλους ελεγκτή
θέσεις υπηρεσίας nest g
Εγκατάσταση Εξαρτήσεων
Αφού ολοκληρώσετε τα παραπάνω βήματα, εκτελέστε αυτήν την εντολή τερματικού για να εγκαταστήσετε το πακέτο NestJS CQRS:
npm install --save @nestjs/cqrs
Δημιουργήστε μια ταχυδρομική υπηρεσία
Προσθέστε τον παρακάτω κώδικα στο δικό σας αναρτήσεις.υπηρεσία.τσ αρχείο για να ορίσετε το PostService τάξη.
// posts.service.ts
εισαγωγή { Ενέσιμο } από'@nestjs/common';εξαγωγήδιεπαφή Θέση {
τίτλος: σειρά;
περιεχόμενο: σειρά;
}@Ενέσιμα()
εξαγωγήτάξη PostService {
ιδιωτικός αναρτήσεις μόνο για ανάγνωση: Δημοσίευση[] = [];δημιουργία (ανάρτηση: Δημοσίευση): Δημοσίευση {
Αυτό.posts.push (post);
ΕΠΙΣΤΡΟΦΗ Θέση;
}
findById (αναγνωριστικό: αριθμός): Θέση {
ΕΠΙΣΤΡΟΦΗΑυτό.posts.find(Θέση => αναγνωριστικό post.id);
}
}
ο PostService ορίζει δημιουργώ και findById μεθόδους για να δημιουργήσετε μια νέα ανάρτηση και να λάβετε μια υπάρχουσα ανάρτηση από το αναγνωριστικό της.
Καθορισμός εντολών και ερωτημάτων
Το επόμενο βήμα είναι να ορίσετε τα ερωτήματα και τις εντολές που αποτελούν τον πυρήνα του μοτίβου σχεδίασης CQRS.
Στο αναρτήσεις κατάλογο, δημιουργήστε δύο νέα αρχεία: δημιουργίαΣostCommand.command.ts και getPostQuery.query.ts. Το αρχείο εντολών θα πρέπει να μοιάζει με αυτό:
// createPostCommand.command.ts
εξαγωγήτάξη CreatePostCommand {
κατασκευαστής(δημόσιο τίτλος μόνο για ανάγνωση: σειρά, δημόσιο περιεχόμενο μόνο για ανάγνωση: σειρά) {}
}
Και το αρχείο ορισμού ερωτήματος, ως εξής:
// getPostQuery.query.ts
εξαγωγήτάξη GetPostQuery {
κατασκευαστής(δημόσιο αναγνωριστικό μόνο για ανάγνωση: αριθμός) {}
}
Δημιουργήστε χειριστές εντολών και ερωτημάτων
Αφού ορίσετε με επιτυχία τις εντολές και τα ερωτήματά σας, πρέπει να δημιουργήσετε χειριστές για αυτά. Ένας χειριστής είναι μια συνάρτηση που εκτελεί μια εντολή ή ερώτημα και επιστρέφει το αποτέλεσμα.
Δημιουργώ ένα χειριστές.τσ αρχείο στο δικό σας Θέση κατάλογο και επικολλήστε τον ακόλουθο κώδικα σε αυτόν:
// χειριστές.τσ
εισαγωγή { CommandHandler, ICommandHandler } από'@nestjs/cqrs';
εισαγωγή { CreatePostCommand } από'./createPostCommand.command.ts';
εισαγωγή { PostService } από"./post.service";@CommandHandler(CreatePostCommand)
εξαγωγήτάξη CreatePostHandler υλοποιεί ICmandHandler{
κατασκευαστής(ιδιωτικός postService μόνο για ανάγνωση: PostService) {}
ασυγχρονισμός εκτέλεση (εντολή: CreatePostCommand) {
συνθ { όνομα, τιμή } = εντολή;
συνθ ανάρτηση = αναμένωΑυτό.postService.create (τίτλος, περιεχόμενο);
ΕΠΙΣΤΡΟΦΗ Θέση;
}
}
Στο ίδιο χειριστές.τσ αρχείο, μπορείτε να τροποποιήσετε τις δηλώσεις εισαγωγής για να συμπεριλάβετε τις παρακάτω, ώστε να επιτρέπεται η εργασία με ερωτήματα. Στη συνέχεια, μπορείτε να εφαρμόσετε το πρόγραμμα χειρισμού ερωτημάτων όπως φαίνεται στον παρακάτω κώδικα:
// χειριστής.τσ
εισαγωγή { QueryHandler, IQueryHandler } από'@nestjs/cqrs';
εισαγωγή { GetPostQuery } από"./getPostQuery.query";
εισαγωγή { PostService } από"./post.service";// χειριστής ερωτημάτων
@QueryHandler(GetProductQuery)
εξαγωγήτάξη GetPostHandler υλοποιεί IQueryHandler{
κατασκευαστής(ιδιωτικός postService μόνο για ανάγνωση: PostService) {}
ασυγχρονισμός execute (ερώτημα: GetPostQuery) {
συνθ { id } = ερώτημα;
συνθ ανάρτηση = αναμένωΑυτό.postService.findOneById (id);
ΕΠΙΣΤΡΟΦΗ Θέση;
}
}
Χειριστές Μητρώων
Το τελευταίο βήμα είναι να καταχωρήσετε τους χειριστές εντολών και ερωτημάτων με τη λειτουργική μονάδα NestJS.
// post.module.ts
εισαγωγή { Ενότητα } από'@nestjs/common';
εισαγωγή { CommandHandlers, QueryHandlers } από'handlers.ts';
εισαγωγή { PostService } από"./post.service";
@Μονάδα μέτρησης({
πάροχοι: [
Post Service,
...CommandHandlers,
...Query Handlers,
],
})
εξαγωγήτάξη PostModule {}
Αυτός ο κωδικός καταχωρεί το PostService, CommandHandlers, και Query Handlers στο παρόχους πίνακας. Η χρήση ενός τελεστή διασποράς (...) είναι να συγχωνεύσετε τους πίνακες του ερώτηση χειριστές και εντολή χειριστές στο παρόχους πίνακας.
Εκτελέστε εντολές και ερωτήματα
Οι καταχωρημένες εντολές και οι χειριστές ερωτημάτων μπορούν να χρησιμοποιηθούν σε ελεγκτές. Ο παρακάτω κώδικας είναι η υλοποίηση του α αναρτήσεις ελεγκτής που θα δέχεται αιτήματα HTTP και θα επιστρέφει τις απαιτούμενες απαντήσεις.
// posts.controller.ts
εισαγωγή { Body, Controller, Post } από'@nestjs/common';
εισαγωγή { CommandBus } από'@nestjs/cqrs';
εισαγωγή { CreatePostCommand } από'./createPostCommand.command.ts';// ελεγκτής που υλοποιεί εντολή
@Ελεγκτής("αναρτήσεις")
εξαγωγήτάξη PostController {
κατασκευαστής(ιδιωτικός CommandBus μόνο για ανάγνωση: CommandBus) {}
@Θέση()
ασυγχρονισμός createPost(@Σώμα() body: { title: σειρά; περιεχόμενο: σειρά }) {
συνθ { τίτλος, περιεχόμενο } = σώμα;
συνθ εντολή = νέος CreatePostCommand (τίτλος, περιεχόμενο).
συνθ ανάρτηση = αναμένωΑυτό.commandBus.execute (εντολή);
ΕΠΙΣΤΡΟΦΗ Θέση;
}
}
Στον παραπάνω κώδικα, το CommandBus εκτελεί το CreatePostCommand και δημιουργεί μια νέα ανάρτηση.
Αυτός ο κώδικας δείχνει πώς να εφαρμόσετε έναν ελεγκτή που χρησιμοποιεί ένα ερώτημα:
// posts.controller.ts
εισαγωγή { Controller, Get, Param } από'@nestjs/common';
εισαγωγή { QueryBus } από'@nestjs/cqrs';
εισαγωγή { GetPostQuery } από"./getPostQuery.query";@Ελεγκτής("αναρτήσεις")
εξαγωγήτάξη PostController {
κατασκευαστής(ιδιωτικός queryBus μόνο για ανάγνωση: QueryBus) {}
@Παίρνω(':ταυτότητα')
ασυγχρονισμός getPost(@Παραμ('ταυτότητα') id: αριθμός) {
συνθ ερώτηση = νέος GetPostQuery (αναγνωριστικό);
συνθ ανάρτηση = αναμένωΑυτό.queryBus.execute (ερώτημα);
ΕΠΙΣΤΡΟΦΗ Θέση;
}
}
ο queryBus εκτελεί GetPostQuery που παίρνει την ανάρτηση με το δεδομένο αναγνωριστικό και την επιστρέφει.
Αφού ολοκληρώσετε όλα τα παραπάνω βήματα, θα πρέπει τώρα να έχετε μια μινιμαλιστική, λειτουργική εφαρμογή για τη δημιουργία και την ανάκτηση αναρτήσεων ιστολογίου.
Αν και ο κώδικας εδώ χρησιμοποιεί έναν πίνακα για την αποθήκευση των δημιουργημένων αναρτήσεων στη μνήμη, είναι πιο πιθανό να χρησιμοποιήσετε μια βάση δεδομένων στην παραγωγή. Μπορείτε είτε να χρησιμοποιήσετε α Βάση δεδομένων SQL, ή α Βάση δεδομένων NoSQL όπως το MongoDB, καθώς το NestJS υποστηρίζει και τις δύο επιλογές.
Δημιουργία API με το μοτίβο σχεδίασης CQRS
Η ενσωμάτωση του μοτίβου σχεδίασης CQRS στην εφαρμογή NestJS μπορεί να βοηθήσει στην επεκτασιμότητα, την απόδοση και τη συντηρησιμότητα. Το CQRS επιτρέπει πιο αποτελεσματικές και βελτιστοποιημένες λειτουργίες διαχωρίζοντας τις λειτουργίες ανάγνωσης και εγγραφής που εκτελεί μια εφαρμογή.
Το πακέτο @nestjs/cqrs παρέχει ένα δομικό στοιχείο για την εφαρμογή CQRS στο NestJS με εντολές και χειριστές ερωτημάτων. Συνολικά, το CQRS είναι ένα ισχυρό μοτίβο που μπορεί να βοηθήσει στη δημιουργία πιο αποτελεσματικών και επεκτάσιμων εφαρμογών και θα πρέπει να σταθμίσετε τις επιλογές σας πριν το χρησιμοποιήσετε.