Asosiy tushunchalar2 min read

Discovery service

@nestjs/core paketidan taqdim etiladigan DiscoveryService - bu NestJS ilovasida provayderlar, kontrollerlar va boshqa metadatalarni dinamik tarzda ko'rib chiqish va olish imkonini

@nestjs/core paketidan taqdim etiladigan DiscoveryService - bu NestJS ilovasida provayderlar, kontrollerlar va boshqa metadatalarni dinamik tarzda ko'rib chiqish va olish imkonini beruvchi kuchli yordamchi vosita. Bu ayniqsa runtime introspeksiyasiga tayanadigan plaginlar, dekoratorlar yoki ilg'or funksiyalarni yaratishda foydali. DiscoveryService dan foydalanish orqali dasturchilar yanada moslashuvchan va modulli arxitekturalarni yaratishi, ilovalarda avtomatlashtirish va dinamik xatti-harakatlarni yoqishi mumkin.

Boshlash

DiscoveryService dan foydalanishdan oldin, uni ishlatmoqchi bo'lgan modulga DiscoveryModule ni import qilishingiz kerak. Bu servis dependency injection orqali mavjud bo'lishini ta'minlaydi. Quyida NestJS modulida uni qanday sozlash ko'rsatilgan:

TypeScript
1import { Module } from '@nestjs/common';
2import { DiscoveryModule } from '@nestjs/core';
3import { ExampleService } from './example.service';
4
5@Module({
6  imports: [DiscoveryModule],
7  providers: [ExampleService],
8})
9export class ExampleModule {}

Modul sozlangandan so'ng, DiscoveryService ni dinamik discovery kerak bo'lgan istalgan provayder yoki servisga in'eksiya qilish mumkin.

TypeScript
example.service
1@Injectable()
2export class ExampleService {
3  constructor(private readonly discoveryService: DiscoveryService) {}
4}

Provayderlar va kontrollerlarni topish

DiscoveryService ning asosiy imkoniyatlaridan biri - ilovadagi barcha ro'yxatdan o'tgan provayderlarni olish. Bu provayderlarni muayyan shartlarga ko'ra dinamik qayta ishlashda foydali. Quyidagi parcha barcha provayderlarga qanday kirishni ko'rsatadi:

TypeScript
1const providers = this.discoveryService.getProviders();
2console.log(providers);

Har bir provayder obyektida uning instansiyasi, tokeni va metadatasi kabi ma'lumotlar bo'ladi. Xuddi shuningdek, ilovadagi barcha ro'yxatdan o'tgan kontrollerlarni olish kerak bo'lsa, buni quyidagicha qilishingiz mumkin:

TypeScript
1const controllers = this.discoveryService.getControllers();
2console.log(controllers);

Bu imkoniyat kontrollerlarni dinamik qayta ishlash kerak bo'lgan holatlarda, masalan, analitika kuzatuvi yoki avtomatik ro'yxatdan o'tkazish mexanizmlarida ayniqsa foydali.

Metadatalarni ajratib olish

Provayderlar va kontrollerlarni topishdan tashqari, DiscoveryService ushbu komponentlarga biriktirilgan metadatalarni olish imkonini ham beradi. Bu ayniqsa runtime paytida metadata saqlaydigan maxsus dekoratorlar bilan ishlaganda qimmatli.

Masalan, maxsus dekorator provayderlarni muayyan metadata bilan belgilaydigan holatni ko'rib chiqaylik:

TypeScript
1import { DiscoveryService } from '@nestjs/core';
2
3export const FeatureFlag = DiscoveryService.createDecorator();

Ushbu dekoratorni servisga qo'llash keyinchalik so'ralishi mumkin bo'lgan metadatalarni saqlash imkonini beradi:

TypeScript
1import { Injectable } from '@nestjs/common';
2import { FeatureFlag } from './custom-metadata.decorator';
3
4@Injectable()
5@FeatureFlag('experimental')
6export class CustomService {}

Shu tarzda metadata provayderlarga biriktirilgach, DiscoveryService belgilangan metadata bo'yicha provayderlarni filtrlashni osonlashtiradi. Quyidagi kod parchasida muayyan metadata qiymati bilan belgilangan provayderlarni qanday olish ko'rsatilgan:

TypeScript
1const providers = this.discoveryService.getProviders();
2
3const [provider] = providers.filter(
4  (item) =>
5    this.discoveryService.getMetadataByDecorator(FeatureFlag, item) ===
6    'experimental',
7);
8
9console.log(
10  'Providers with the "experimental" feature flag metadata:',
11  provider,
12);

Xulosa

DiscoveryService - NestJS ilovalarida runtime introspeksiyasini yoqadigan ko'p qirrali va kuchli vosita. Provayderlar, kontrollerlar va metadatalarni dinamik tarzda topish imkonini bergani uchun, u kengaytiriladigan freymvorklar, plaginlar va avtomatlashtirishga yo'naltirilgan funksiyalarni qurishda muhim rol o'ynaydi. Provayderlarni skan qilish va qayta ishlash, ilg'or qayta ishlash uchun metadatalarni ajratib olish yoki modulli va masshtablanadigan arxitekturalarni yaratish kerak bo'lsa, DiscoveryService bu maqsadlarga erishish uchun samarali va tartibli yondashuvni taqdim etadi.