خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

مقدمه ای بر CQRS در NestJS

از الگوی CQRS با دقت استفاده کنید و می‌توانید برنامه‌های Nest تمیزتر و مقیاس‌پذیرتر ایجاد کنید.

یک رویکرد رایج برای توسعه NestJS، ساخت سرویس هایی است که کنترلرها برای دسترسی به داده ها با آنها ارتباط برقرار می کنند. اما این رویکرد تنها الگوی طراحی معتبر در NestJS نیست. الگوهای طراحی دیگری مانند الگوی طراحی CQRS وجود دارد.

CQRS یک الگوی طراحی است که عملیات خواندن و نوشتن یک برنامه را از هم جدا می کند. این جداسازی می تواند به بهبود مقیاس پذیری، عملکرد و قابلیت نگهداری کمک کند.

همه چیز را در مورد CQRS و نحوه اعمال آن هنگام ساختن یک NestJS API بیابید.

CQRS چیست؟

CQRS مخفف عبارت Command-Queery Segregation مسئولیت است. استفاده از دستورات را برای ایجاد، به روز رسانی و حذف داده ها و پرس و جوها برای واکشی داده ها اجرا می کند. این کمک می کند تا نیازی به پیاده سازی فراخوانی های پایگاه داده یک برنامه در سرویس ها نباشد.

همچنین تمایز واضحی بین منطق جستجوی داده ها از پایگاه داده و انجام سایر اقدامات در یک برنامه کاربردی را امکان پذیر می کند.

رویکرد CQRS در طراحی دامنه محور مفید است، که به شما امکان می دهد منطق دامنه و عملیات زیرساختی را در برنامه خود جدا کنید. همچنین می توانید از آن برای پیاده سازی منطق تجاری پیچیده استفاده کنید، اما این برای برنامه های ساده تر توصیه نمی شود.

استفاده از CQRS در NestJS API

می‌توانید از الگوی طراحی CQRS در یک API که در NestJS می‌سازید استفاده کنید. برای پیگیری، باید Node.js و نسخه اخیر NestJS را روی رایانه خود نصب کرده باشید.

از مراحل زیر برای ایجاد یک برنامه وبلاگ نویسی ساده که الگوی طراحی CQRS را پیاده سازی می کند، استفاده کنید.

یک پروژه Nest ایجاد کنید

یک پروژه Nest جدید ایجاد کنید و یک منبع پست برای یک برنامه وبلاگ ایجاد کنید. با اجرای دستورات زیر در ترمینال می توانید این کار را انجام دهید:

nest new nestjs-cqrs
nest g module posts
nest g controller posts
nest g service posts

Dependencies را نصب کنید

پس از انجام مراحل بالا، این دستور ترمینال را برای نصب بسته NestJS CQRS اجرا کنید:

npm install --save @nestjs/cqrs

یک سرویس پست ایجاد کنید

کد زیر را به فایل posts.service.ts خود اضافه کنید تا کلاس PostService تعریف شود.

// posts.service.ts
import { Injectable } from '@nestjs/common';

export interface Post {
    title: string;
    content: string;
}

@Injectable()
export class PostService {
  private readonly posts: Post[] = [];

  create(post: Post): Post {
    this.posts.push(post);
    return post;
  }

  findById(id: number): Post {
    return this.posts.find(post => post.id === id);
  }
}

PostService متدهای create و findById را برای ایجاد یک پست جدید و دریافت پست موجود از شناسه آن تعریف می کند.

مطلب مرتبط:   نحوه پیاده سازی سیستم سلامت و آسیب در گودو

دستورات و کوئری ها را تعریف کنید

گام بعدی، تعریف پرس و جوها و دستوراتی است که هسته اصلی الگوی طراحی CQRS هستند.

در فهرست پست ها، دو فایل جدید ایجاد کنید: createPostCommand.command.ts و getPostQuery.query.ts. فایل فرمان باید به شکل زیر باشد:

// createPostCommand.command.ts
export class CreatePostCommand {
  constructor(public readonly title: string, public readonly content: string) {}
}

و فایل تعریف پرس و جو، مانند این:

// getPostQuery.query.ts
export class GetPostQuery {
  constructor(public readonly id: number) {}
}

کنترل کننده های فرمان و پرس و جو ایجاد کنید

پس از اینکه دستورات و پرس و جوهای خود را با موفقیت تعریف کردید، باید برای آنها هندلرهایی ایجاد کنید. هندلر تابعی است که دستور یا پرس و جو را اجرا می کند و نتیجه را برمی گرداند.

یک فایل handlers.ts در پوشه پست خود ایجاد کنید و کد زیر را در آن قرار دهید:

// handlers.ts
import { CommandHandler, ICommandHandler } from '@nestjs/cqrs';
import { CreatePostCommand } from './createPostCommand.command.ts';
import { PostService } from './post.service';

@CommandHandler(CreatePostCommand)
export class CreatePostHandler implements ICommandHandler<CreatePostCommand> {
  constructor(private readonly postService: PostService) {}

  async execute(command: CreatePostCommand) {
    const { name, price } = command;
    const post = await this.postService.create(title, content);
    return post;
  }
}

در همان فایل handlers.ts، می‌توانید عبارت‌های import را طوری تغییر دهید که شامل موارد زیر باشد تا امکان کار با کوئری‌ها فراهم شود. سپس می توانید کنترل کننده پرس و جو را همانطور که در کد زیر مشاهده می کنید پیاده سازی کنید:

// handler.ts
import { QueryHandler, IQueryHandler } from '@nestjs/cqrs';
import { GetPostQuery } from './getPostQuery.query';
import { PostService } from './post.service';

// query handler
@QueryHandler(GetProductQuery)
export class GetPostHandler implements IQueryHandler<GetPostQuery> {
  constructor(private readonly postService: PostService) {}

  async execute(query: GetPostQuery) {
    const { id } = query;
    const post = await this.postService.findOneById(id);
    return post;
  }
}

گردانندگان ثبت نام

آخرین مرحله ثبت فرمان و کنترل کننده پرس و جو با ماژول NestJS است.

// post.module.ts
import { Module } from '@nestjs/common';
import { CommandHandlers, QueryHandlers } from 'handlers.ts';
import { PostService } from './post.service';

@Module({
  providers: [
    PostService,
    ...CommandHandlers,
    ...QueryHandlers,
  ],
})
export class PostModule {}

این کد PostService، CommandHandlers و QueryHandlers را در آرایه ارائه دهندگان ثبت می کند. استفاده از عملگر spread (…) برای ادغام آرایه های کنترل کننده پرس و جو و کنترل کننده فرمان در آرایه ارائه دهنده است.

مطلب مرتبط:   نحوه استفاده از پایتون برای معکوس کردن یک رشته

دستورات و کوئری ها را اجرا کنید

دستورات ثبت شده و کنترل کننده پرس و جو در کنترلرها قابل استفاده هستند. کد زیر پیاده سازی یک کنترل کننده پست است که درخواست های HTTP را می پذیرد و پاسخ های مورد نیاز را برمی گرداند.

// posts.controller.ts
import { Body, Controller, Post } from '@nestjs/common';
import { CommandBus } from '@nestjs/cqrs';
import { CreatePostCommand } from './createPostCommand.command.ts';

// controller that implements command
@Controller('posts')
export class PostController {
  constructor(private readonly commandBus: CommandBus) {}

  @Post()
  async createPost(@Body() body: { title: string; content: string }) {
    const { title, content } = body;
    const command = new CreatePostCommand(title, content);
    const post = await this.commandBus.execute(command);
    return post;
  }
}

در کد بالا، CommandBus CreatePostCommand را اجرا کرده و یک پست جدید ایجاد می کند.

این کد نحوه پیاده‌سازی کنترل‌کننده‌ای را نشان می‌دهد که از یک پرس و جو استفاده می‌کند:

// posts.controller.ts
import { Controller, Get, Param } from '@nestjs/common';
import { QueryBus } from '@nestjs/cqrs';
import { GetPostQuery } from './getPostQuery.query';

@Controller('posts')
export class PostController {
  constructor(private readonly queryBus: QueryBus) {}

  @Get(':id')
  async getPost(@Param('id') id: number) {
    const query = new GetPostQuery(id);
    const post = await this.queryBus.execute(query);
    return post;
  }
}

queryBus GetPostQuery را اجرا می کند که پست را با شناسه داده شده دریافت می کند و آن را برمی گرداند.

پس از انجام تمام مراحل بالا، اکنون باید یک برنامه کاربردی مینیمالیستی برای ایجاد و واکشی پست های وبلاگ داشته باشید.

اگرچه کد اینجا از یک آرایه برای ذخیره پست‌های ایجاد شده در حافظه استفاده می‌کند، اما به احتمال زیاد از پایگاه داده در تولید استفاده می‌کنید. می توانید از پایگاه داده SQL یا پایگاه داده NoSQL مانند MongoDB استفاده کنید، زیرا NestJS از هر دو گزینه پشتیبانی می کند.

مطلب مرتبط:   درک زمینه ها در Go

ساخت API با الگوی طراحی CQRS

گنجاندن الگوی طراحی CQRS در برنامه NestJS می‌تواند به مقیاس‌پذیری، عملکرد و نگهداری کمک کند. CQRS با جدا کردن عملیات خواندن و نوشتن که یک برنامه انجام می دهد، عملیات کارآمدتر و بهینه تر را امکان پذیر می کند.

بسته @nestjs/cqrs یک بلوک ساختمانی برای پیاده‌سازی CQRS در NestJS با دستورات و کنترل‌کننده‌های پرس و جو فراهم می‌کند. به طور کلی، CQRS یک الگوی قدرتمند است که می‌تواند به ایجاد برنامه‌های کارآمدتر و مقیاس‌پذیر کمک کند، و شما باید گزینه‌های خود را قبل از استفاده از آن بسنجید.