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
@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
@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
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
@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