Nestjs 导入服务或整个模块

Nestjs import service or the whole module

我是 Nestjs 的新手,如果我想在另一个模块中注入,我不明白什么时候需要导入整个模块或只导入服务。

例如: 我有我的 loggingModule

import { Module } from "@nestjs/common";
import { LoggingService } from "./logging.service";

@Module({
    providers: [LoggingService],
    exports: [LoggingService],
})
export class LoggingModule {}

使用我的登录服务:

import { Injectable } from "@nestjs/common";

@Injectable()
export class LoggingService {

    logToConsole(logString: string) {
        console.log(logString)
    }
}

我想将它导入另一个模块,比如 BookModule

import { Module } from "@nestjs/common";
import { LoggingModule } from "src/logging/logging.module";
import { BookController } from "./book.controller";
import { BooksService } from "./books.service";


@Module({
    controllers: [BookController],
    providers: [BooksService],
    imports: [LoggingModule]
})
export class BooksModule {

}

在我的控制器中我可以做:

@Controller('books')
export class BookController {

    constructor(private booksService: BooksService, private loggingService: LoggingService) {}

问题是: 当我需要导入整个模块而不是提供商中的单个服务 (LogginService) 时,例如:

@Module({
    controllers: [BookController],
    providers: [BooksService,LoggingService],
})
export class BooksModule {

99% 的时间,导入模块。在 Nest 中,如果你导入模块,你会得到与已经创建的 class 相同的实例。如果将 provider 添加到 providers 数组,您最终会得到一个新实例,这不是很多人通常想要的。只要模块导出提供程序,您就会 re-use 创建的实例,这意味着更少的内存使用,更少的 class 实例数量泄漏,这意味着更少的时间来追踪为什么 this.someClass.field 不等于 this.someClass.field