Ostrożnie używaj wzorca CQRS, a będziesz mógł tworzyć czystsze, bardziej skalowalne aplikacje Nest.
Powszechnym podejściem do rozwoju NestJS jest budowanie usług, z którymi komunikują się kontrolerzy w celu uzyskania dostępu do danych. Ale to podejście nie jest jedynym prawidłowym wzorcem projektowym w NestJS. Istnieją inne wzorce projektowe, takie jak wzorzec projektowy CQRS.
CQRS to wzorzec projektowy, który oddziela operacje odczytu i zapisu aplikacji. Ta separacja może pomóc poprawić skalowalność, wydajność i łatwość konserwacji.
Dowiedz się wszystkiego o CQRS i o tym, jak możesz go zastosować podczas tworzenia API NestJS.
Co to jest CQRS?
CQRS oznacza segregacja odpowiedzialności za polecenie-zapytanie. Implementuje użycie polecenia do tworzenia, aktualizowania i usuwania danych oraz zapytania aby pobrać dane. Pomaga to wyeliminować potrzebę implementacji wywołań bazy danych aplikacji w usługach.
Umożliwia również wyraźne rozróżnienie pomiędzy logiką odpytywania bazy danych o dane a wykonywaniem innych czynności w aplikacji.
Podejście CQRS jest przydatne w projektowanie oparte na domenie, co pozwala oddzielić logikę domeny i operacje infrastrukturalne w aplikacji. Można go również użyć do implementacji złożonej logiki biznesowej, ale nie jest to zalecane w przypadku prostszych aplikacji.
Korzystanie z CQRS w interfejsie API NestJS
Możesz użyć wzorca projektowego CQRS w interfejsie API, który budujesz w NestJS. Aby podążać, musisz mieć Node.js zainstalowany na twoim komputerze i najnowszą wersję NestJS.
Wykonaj poniższe kroki, aby zbudować prostą aplikację do blogowania, która implementuje wzorzec projektowy CQRS.
Utwórz projekt Nest
Utwórz nowy projekt Nest i wygeneruj plik post zasób dla aplikacji blogowej. Możesz to zrobić, uruchamiając następujące polecenia w terminalu:
zagnieżdż nowe nestjs-cqrs
zagnieżdżaj posty modułu g
gniazda g posty kontrolera
gniazduj posty serwisowe g
Zainstaluj zależności
Po wykonaniu powyższych kroków uruchom to polecenie terminala, aby zainstalować pakiet NestJS CQRS:
npm install --save @nestjs/cqrs
Utwórz usługę pocztową
Dodaj następujący kod do swojego posty.usługi.ts plik do zdefiniowania Poczta klasa.
// posty.service.ts
import { Do wstrzykiwań } z'@nestjs/wspólne';eksportinterfejs Post {
tytuł: strunowy;
treść: strunowy;
}@Do wstrzykiwań()
eksportklasa Poczta {
prywatny posty tylko do odczytu: Post[] = [];utwórz (opublikuj: Opublikuj): Opublikuj {
Ten.posts.push (post);
powrót post;
}
findById (identyfikator: numer): Post {
powrótTen.posty.znajdź(post => identyfikator postu);
}
}
The Poczta definiuje tworzyć I znajdźWgId metody, aby utworzyć nowy post i pobrać istniejący post z jego identyfikatora.
Zdefiniuj polecenia i zapytania
Następnym krokiem jest zdefiniowanie zapytań i poleceń, które są podstawą wzorca projektowego CQRS.
w posty katalog, utwórz dwa nowe pliki: utwórz PostCommand.command.ts I getPostQuery.query.ts. Plik poleceń powinien wyglądać następująco:
// utwórzPostCommand.command.ts
eksportklasa CreatePostCommand {
konstruktor(publiczny tytuł tylko do odczytu: strunowy, publiczny zawartość tylko do odczytu: strunowy) {}
}
A plik definicji zapytania, taki jak ten:
// getPostQuery.query.ts
eksportklasa GetPostQuery {
konstruktor(publiczny identyfikator tylko do odczytu: numer) {}
}
Tworzenie programów obsługi poleceń i zapytań
Po pomyślnym zdefiniowaniu poleceń i zapytań należy utworzyć dla nich procedury obsługi. Program obsługi to funkcja, która uruchamia polecenie lub zapytanie i zwraca wynik.
Stwórz handlers.ts plik w swoim post katalog i wklej w nim następujący kod:
// handlers.ts
import { CommandHandler, ICommandHandler } z'@nestjs/cqrs';
import { CreatePostCommand } z„./createPostCommand.command.ts”;
import { Poczta } z'./Poczta';@CommandHandler(CreatePostCommand)
eksportklasa CreatePostHandler przybory ICommandHandler{
konstruktor(prywatny usługa pocztowa tylko do odczytu: usługa pocztowa) {}
asynchroniczny wykonaj (polecenie: CreatePostCommand) {
konst { nazwa, cena } = polecenie;
konst poczta = czekać naTen.postService.create (tytuł, treść);
powrót post;
}
}
W tym samym handlers.ts plik, możesz zmodyfikować instrukcje importu, aby uwzględnić poniższe, aby umożliwić pracę z zapytaniami. Następnie możesz zaimplementować procedurę obsługi zapytań, jak pokazano w poniższym kodzie:
// handler.ts
import { QueryHandler, IQueryHandler} z'@nestjs/cqrs';
import { GetPostQuery } z'./getPostQuery.query';
import { Poczta } z'./Poczta';// obsługa zapytań
@QueryHandler(GetProductQuery)
eksportklasa GetPostHandler przybory IQueryHandler{
konstruktor(prywatny usługa pocztowa tylko do odczytu: usługa pocztowa) {}
asynchroniczny wykonaj (zapytanie: GetPostQuery) {
konst { identyfikator } = zapytanie;
konst poczta = czekać naTen.postService.findOneById (identyfikator);
powrót post;
}
}
Zarejestruj Handlarzy
Ostatnim krokiem jest zarejestrowanie obsługi poleceń i zapytań w module NestJS.
// post.module.ts
import { Moduł } z'@nestjs/wspólne';
import { Programy obsługi poleceń, programy obsługi zapytań } z'handlers.ts';
import { Poczta } z'./Poczta';
@Moduł({
dostawcy: [
Poczta,
...programy obsługi poleceń,
...Programy obsługi zapytań,
],
})
eksportklasa Moduł postu {}
Ten kod rejestruje Poczta, Programy obsługi poleceń, I Programy obsługi zapytań w dostawcy szyk. Użycie operatora rozprzestrzeniania (...) polega na scaleniu tablic zapytanie obsługi i Komenda obsługi w dostawcy szyk.
Wykonywanie poleceń i zapytań
Zarejestrowane polecenia i procedury obsługi zapytań są użyteczne w kontrolerach. Poniższy kod jest implementacją a posty kontroler, który będzie akceptował żądania HTTP i zwracał wymagane odpowiedzi.
// posty.kontroler.ts
import { Treść, kontroler, wpis } z'@nestjs/wspólne';
import { Magistrala poleceń} z'@nestjs/cqrs';
import { CreatePostCommand } z„./createPostCommand.command.ts”;// kontroler implementujący polecenie
@Kontroler(„posty”)
eksportklasa Kontroler poczty {
konstruktor(prywatny tylko do odczytu commandbus: CommandBus) {}
@Post()
asynchroniczny utwórzPost(@Ciało() treść: { tytuł: strunowy; treść: strunowy }) {
konst { tytuł, treść } = treść;
konst polecenie = nowy CreatePostCommand (tytuł, treść);
konst poczta = czekać naTen.commandBus.execute (polecenie);
powrót post;
}
}
W powyższym kodzie plik CommandBus wykonuje Polecenie UtwórzPost i tworzy nowy wpis.
Ten kod pokazuje, jak zaimplementować kontroler korzystający z zapytania:
// posty.kontroler.ts
import { Kontroler, Pobierz, Parametr } z'@nestjs/wspólne';
import { QueryBus} z'@nestjs/cqrs';
import { GetPostQuery } z'./getPostQuery.query';@Kontroler(„posty”)
eksportklasa Kontroler poczty {
konstruktor(prywatny QueryBus tylko do odczytu: QueryBus) {}
@Dostawać(':ID')
asynchroniczny pobierzPost(@Param('ID') ID: numer) {
konst zapytanie = nowy GetPostQuery (identyfikator);
konst poczta = czekać naTen.queryBus.execute (zapytanie);
powrót post;
}
}
The zapytanieBus wykonuje GetPostQuery który pobiera post z podanym identyfikatorem i zwraca go.
Po wykonaniu wszystkich powyższych kroków powinieneś mieć minimalistyczną, działającą aplikację do tworzenia i pobierania postów na blogu.
Chociaż kod tutaj wykorzystuje tablicę do przechowywania utworzonych postów w pamięci, bardziej prawdopodobne jest użycie bazy danych w środowisku produkcyjnym. Możesz albo użyć A Baza danych SQLlub a Baza danych NoSQL, taka jak MongoDB, ponieważ NestJS obsługuje obie opcje.
Tworzenie interfejsów API za pomocą wzorca projektowego CQRS
Włączenie wzorca projektowego CQRS do aplikacji NestJS może pomóc w skalowalności, wydajności i łatwości konserwacji. CQRS pozwala na wydajniejsze i zoptymalizowane operacje poprzez oddzielenie operacji odczytu i zapisu wykonywanych przez aplikację.
Pakiet @nestjs/cqrs zapewnia blok konstrukcyjny do implementacji CQRS w NestJS z poleceniami i procedurami obsługi zapytań. Ogólnie rzecz biorąc, CQRS to potężny wzorzec, który może pomóc w tworzeniu bardziej wydajnych i skalowalnych aplikacji, dlatego przed użyciem należy rozważyć opcje.