0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Module Reference trong NestJS: Hướng Dẫn Chi Tiết và Ví Dụ Thực Tế

Đăng vào 1 tháng trước

• 2 phút đọc

Module Reference trong NestJS

ModuleRef là một công cụ vô cùng hữu ích trong NestJS, cho phép bạn truy cập và tương tác linh hoạt với các dịch vụ (services) giữa các module trong thời gian chạy (runtime). Đây là một tính năng mạnh mẽ đặc biệt khi bạn phải làm việc với các phụ thuộc không thể được xác định trước khi biên dịch hoặc khi bạn muốn truy cập các dịch vụ từ các module khác mà không cần sử dụng trực tiếp phương pháp injection.

1. Ví Dụ Thực Tế Sử Dụng Module Reference

1.1. Lấy một service từ một module khác

Giả sử bạn có ModuleA cần gọi ServiceB từ ModuleB. Bạn có thể sử dụng ModuleRef để truy xuất ServiceB mà không cần phải inject nó vào ModuleA.

typescript Copy
@Injectable()
export class ModuleAService {
  constructor(private moduleRef: ModuleRef) {}

  someMethod() {
    const serviceB = this.moduleRef.get(ServiceB);
    serviceB.someFunction();
  }
}

1.2. Cung cấp dịch vụ động

Khi phát triển một plugin hoặc hệ thống microservices, nơi các module có thể thay đổi hoặc bổ sung tại runtime, ModuleRef cho phép bạn tạo và sử dụng các provider động một cách hiệu quả.

1.3. Sử dụng với các provider chưa được đăng ký

ModuleRef còn giúp bạn tạo ra các instance của các provider mà không cần đăng ký chúng một cách tĩnh.

2. Các Trường Hợp Sử Dụng Module Reference

2.1. Lấy instance của provider chưa đăng ký

Trong một số tình huống đặc biệt, như khi sử dụng plugin, bạn có thể không thể biết được module nào cần dùng service nào. ModuleRef giúp bạn lấy service một cách linh hoạt.

Ví dụ: Bạn có thể lấy instance của một provider trong một service mà không cần inject trực tiếp từ constructor:

typescript Copy
@Injectable()
export class AppService {
  constructor(private moduleRef: ModuleRef) {}

  getDynamicService() {
    const dynamicService = this.moduleRef.get(SomeService);
    dynamicService.doSomething();
  }
}

2.2. Truy xuất các provider từ các module khác

ModuleRef cho phép bạn truy xuất các provider từ các module khác mà không cần phải inject chúng trong constructor.

typescript Copy
import { Injectable, ModuleRef } from '@nestjs/common';
import { SomeOtherService } from './some-other.service';

@Injectable()
export class AnotherService {
  constructor(private moduleRef: ModuleRef) {}

  useService() {
    const serviceFromAnotherModule = this.moduleRef.get(SomeOtherService);
    serviceFromAnotherModule.performAction();
  }
}

2.3. Dùng trong các module động

Trong những tình huống như plugin hoặc các module thay đổi, bạn có thể dùng ModuleRef để truy xuất và tạo các provider một cách động.

typescript Copy
@Injectable()
export class PluginService {
  constructor(private moduleRef: ModuleRef) {}

  loadPlugin() {
    const plugin = this.moduleRef.get(PluginService);
    plugin.initialize();
  }
}

Tóm Lại

Như vậy, các ví dụ trên cho thấy cách sử dụng ModuleRef để linh hoạt lấy và sử dụng các provider trong những tình huống khác nhau, từ đó giúp bạn xây dựng ứng dụng NestJS một cách dễ dàng và dễ mở rộng. ModuleRef mở ra những khả năng mới trong việc quản lý các dịch vụ, đặc biệt là trong các trường hợp phức tạp.

Liên Hệ và Tài Nguyên Tham Khảo

#nestjs #backend
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào