CQRS modelini dikkatli kullanın ve daha temiz, daha ölçeklenebilir Nest uygulamaları oluşturabilirsiniz.
NestJS geliştirmeye yönelik yaygın bir yaklaşım, denetleyicilerin verilere erişmek için iletişim kurduğu hizmetler oluşturmaktır. Ancak bu yaklaşım, NestJS'deki tek geçerli tasarım modeli değildir. CQRS tasarım deseni gibi başka tasarım desenleri de vardır.
CQRS, bir uygulamanın okuma ve yazma işlemlerini ayıran bir tasarım desenidir. Bu ayırma, ölçeklenebilirliği, performansı ve sürdürülebilirliği iyileştirmeye yardımcı olabilir.
CQRS hakkında her şeyi ve bir NestJS API oluştururken bunu nasıl uygulayabileceğinizi öğrenin.
CQRS Nedir?
CQRS anlamına gelir komut sorgusu sorumluluk ayrımı. kullanımını gerçekleştirir komutlar veri oluşturmak, güncellemek ve silmek ve sorguları veri almak için. Bu, bir uygulamanın veritabanı çağrılarını hizmetlere uygulama ihtiyacını ortadan kaldırmaya yardımcı olur.
Ayrıca veri için veritabanını sorgulama mantığı ile bir uygulamada diğer eylemleri gerçekleştirme mantığı arasında net bir ayrım sağlar.
CQRS yaklaşımı şu durumlarda yararlıdır: etki alanına dayalı tasarım, uygulamanızdaki etki alanı mantığını ve altyapı işlemlerini ayırmanıza olanak tanır. Karmaşık iş mantığını uygulamak için de kullanabilirsiniz, ancak bu daha basit uygulamalar için önerilmez.
NestJS API'sinde CQRS kullanma
NestJS'de oluşturduğunuz bir API'de CQRS tasarım modelini kullanabilirsiniz. Takip etmek için sahip olmanız gerekir Node.js bilgisayarınızda yüklü ve NestJS'nin yeni bir sürümü.
CQRS tasarım modelini uygulayan basit bir blog uygulaması oluşturmak için aşağıdaki adımları kullanın.
Bir Nest Projesi Oluşturun
Yeni bir Nest projesi oluşturun ve postalamak bir blog uygulaması için kaynak. Bunu bir terminalde aşağıdaki komutları çalıştırarak yapabilirsiniz:
yuva yeni nestjs-cqrs
yuva g modülü gönderileri
yuva g denetleyici gönderileri
yuva g hizmet gönderileri
Bağımlılıkları Yükle
Yukarıdaki adımları tamamladıktan sonra NestJS CQRS paketini yüklemek için bu terminal komutunu çalıştırın:
npm kurulum --save @nestjs/cqrs
Bir Posta Hizmeti Oluşturun
Aşağıdaki kodu kendinize ekleyin gönderiler.hizmet.ts tanımlamak için dosya Posta Servisi sınıf.
// gönderiler.hizmet.ts
içe aktarmak { Enjekte edilebilir } itibaren"@nestjs/ortak";ihracatarayüz Postalamak {
başlık: sicim;
içerik: sicim;
}@enjekte edilebilir()
ihracatsınıf Posta Servisi {
özel salt okunur gönderiler: Gönderi[] = [];oluştur (yayın: Gönderi): Gönderi {
Bu.posts.push (gönderi);
geri dönmek postalamak;
}
findById (id: sayı): Postalamak {
geri dönmekBu.posts.find(postalamak => post.id kimliği);
}
}
bu Posta Servisi tanımlar yaratmak Ve findById yeni bir gönderi oluşturma ve mevcut bir gönderiyi kimliğinden alma yöntemleri.
Komutları ve Sorguları Tanımlayın
Bir sonraki adım, CQRS tasarım modelinin çekirdeğini oluşturan sorguları ve komutları tanımlamaktır.
İçinde gönderiler dizini, iki yeni dosya oluşturun: oluşturPostCommand.command.ts Ve getPostQuery.query.ts. Komut dosyası şöyle görünmelidir:
// PostCommand.command.ts oluştur
ihracatsınıf CreatePostCommand {
inşaatçı(halk salt okunur başlık: sicim, halk salt okunur içerik: sicim) {}
}
Ve sorgu tanım dosyası, bunun gibi:
// getPostQuery.query.ts
ihracatsınıf GetPostQuery {
inşaatçı(halk salt okunur kimlik: sayı) {}
}
Komut ve Sorgu İşleyicileri Oluşturun
Komutlarınızı ve sorgularınızı başarıyla tanımladıktan sonra, bunlar için işleyiciler oluşturmanız gerekir. İşleyici, bir komut veya sorgu çalıştıran ve sonucu döndüren bir işlevdir.
Oluşturmak işleyiciler.ts senin dosyanda postalamak dizini ve içine aşağıdaki kodu yapıştırın:
// işleyiciler.ts
içe aktarmak { CommandHandler, ICommandHandler } itibaren"@nestjs/cqrs";
içe aktarmak { CreatePostCommand } itibaren'./createPostCommand.command.ts';
içe aktarmak { Posta Servisi } itibaren'./posta Servisi';@CommandHandler(PostCommand Oluştur)
ihracatsınıf PostHandler Oluştur uygular ICommandHandler{
inşaatçı(özel salt okunur posta Hizmeti: Posta Hizmeti) {}
zaman uyumsuz yürüt (komut: CreatePostCommand) {
sabit { isim, fiyat } = komut;
sabit gönderi = beklemekBu.postService.create (başlık, içerik);
geri dönmek postalamak;
}
}
Aynısı işleyiciler.ts dosyasında, sorgularla çalışmaya izin vermek için aşağıdakileri içerecek şekilde içe aktarma ifadelerini değiştirebilirsiniz. Ardından, sorgu işleyicisini aşağıdaki kodda görüldüğü gibi uygulayabilirsiniz:
// işleyici.ts
içe aktarmak { QueryHandler, IQueryHandler } itibaren"@nestjs/cqrs";
içe aktarmak {GetPostQuery } itibaren'./getPostQuery.query';
içe aktarmak { Posta Servisi } itibaren'./posta Servisi';// sorgu işleyici
@QueryHandler(GetProductQuery)
ihracatsınıf GetPostHandler uygular IQueryHandler{
inşaatçı(özel salt okunur posta Hizmeti: Posta Hizmeti) {}
zaman uyumsuz yürüt (sorgu: GetPostQuery) {
sabit { kimlik } = sorgu;
sabit gönderi = beklemekBu.postService.findOneById (id);
geri dönmek postalamak;
}
}
İşleyicileri Kaydet
Son adım, komut ve sorgu işleyicilerini NestJS modülüne kaydetmektir.
// post.module.ts
içe aktarmak { Modül } itibaren"@nestjs/ortak";
içe aktarmak { CommandHandlers, QueryHandlers } itibaren"işleyiciler.ts";
içe aktarmak { Posta Servisi } itibaren'./posta Servisi';
@Modül({
sağlayıcılar: [
Posta Servisi,
...CommandHandlers,
...QueryHandlers,
],
})
ihracatsınıf Posta Modülü {}
Bu kod şunları kaydeder: Posta Servisi, CommandHandlers, Ve QueryHandlers içinde sağlayıcılar sıralamak. Yayılma operatörünün kullanımı (...) dizilerini birleştirmek sorgu işleyiciler ve emretmek işleyiciler içine sağlayıcılar sıralamak.
Komutları ve Sorguları Çalıştırın
Kayıtlı komutlar ve sorgu işleyicileri, denetleyicilerde kullanılabilir. Aşağıdaki kod, bir gönderiler HTTP isteklerini kabul edecek ve gerekli yanıtları döndürecek denetleyici.
// gönderiler.kontrolcü.ts
içe aktarmak { Gövde, Denetleyici, Gönderi } itibaren"@nestjs/ortak";
içe aktarmak { Komut Veri Yolu } itibaren"@nestjs/cqrs";
içe aktarmak { CreatePostCommand } itibaren'./createPostCommand.command.ts';// komutu uygulayan denetleyici
@Denetleyici('gönderiler')
ihracatsınıf PostController {
inşaatçı(özel salt okunur komutBus: CommandBus) {}
@Postalamak()
zaman uyumsuz Gönderi oluştur(@Vücut() gövde: { başlık: sicim; içerik: sicim }) {
sabit { başlık, içerik } = gövde;
sabit komut = yeni CreatePostCommand (başlık, içerik);
sabit gönderi = beklemekBu.commandBus.execute (komut);
geri dönmek postalamak;
}
}
Yukarıdaki kodda, Komut Veriyolu yürütür Komut Sonrası Oluştur ve yeni bir gönderi oluşturur.
Bu kod, sorgu kullanan bir denetleyicinin nasıl uygulanacağını gösterir:
// gönderiler.kontrolcü.ts
içe aktarmak { Denetleyici, Al, Param } itibaren"@nestjs/ortak";
içe aktarmak { Sorgu Veriyolu } itibaren"@nestjs/cqrs";
içe aktarmak {GetPostQuery } itibaren'./getPostQuery.query';@Denetleyici('gönderiler')
ihracatsınıf PostController {
inşaatçı(özel salt okunur QueryBus: QueryBus) {}
@Elde etmek(':İD')
zaman uyumsuz postayı al(@param('İD') kimlik: sayı) {
sabit sorgu = yeni GetPostQuery (id);
sabit gönderi = beklemekBu.queryBus.execute (sorgu);
geri dönmek postalamak;
}
}
bu sorguBus yürütür GetPostQuery verilen kimliğe sahip gönderiyi alır ve döndürür.
Yukarıdaki tüm adımları tamamladıktan sonra, artık blog gönderileri oluşturmak ve almak için minimalist, çalışan bir uygulamaya sahip olmalısınız.
Buradaki kod, oluşturulan gönderileri bellekte depolamak için bir dizi kullansa da, üretimde bir veritabanı kullanmanız daha olasıdır. ya kullanabilirsiniz SQL veritabanıveya bir MongoDB gibi NoSQL veritabanı, çünkü NestJS her iki seçeneği de destekler.
CQRS Tasarım Modeli ile API'ler Oluşturma
CQRS tasarım modelini NestJS uygulamanıza dahil etmek, ölçeklenebilirlik, performans ve sürdürülebilirlik konularında yardımcı olabilir. CQRS, bir uygulamanın gerçekleştirdiği okuma ve yazma işlemlerini ayırarak daha verimli ve optimize edilmiş işlemlere izin verir.
@nestjs/cqrs paketi, NestJS'de CQRS'yi komutlar ve sorgu işleyicilerle uygulamak için bir yapı taşı sağlar. Genel olarak, CQRS, daha verimli ve ölçeklenebilir uygulamalar oluşturmaya yardımcı olabilecek güçlü bir modeldir ve kullanmadan önce seçeneklerinizi tartmanız gerekir.