我正在NestJS官方文档中阅读NestJS,我想尝试共享模块。
因此,我的应用程序有以下结构:
src
├── cats
│ ├── cats.controller.ts
| ├── cats.module.ts
| └── cats.service.ts
├── users
│ ├── users.controller.ts
| ├── users.module.ts
| └── users.service.ts
├── app.controller.ts
├── app.module.ts
├── app.service.ts
└── main.ts我知道,在NestJS中,模块默认是单件和共享模块,只要您导出它的服务并将其模块导入到另一个模块。在这里读一下。
最后,我想知道它是否是真的,因此我没有遵循文档,而是直接将cats.service.ts导入到另一个名为users.service.ts的服务中,如下所示:
src/users/users.controller.ts
import { Controller, Get } from '@nestjs/common';
import { UsersService } from './user.service';
@Controller('users')
export class UserController {
constructor(private readonly usersService: UsersService) {}
@Get('get-cats')
getCats() {
return this.usersService.getCats();
}
}src/users/users.service.ts,我直接从这里进口的。
import { Inject, Injectable } from '@nestjs/common';
import { CatsService } from 'src/cats/cats.service.ts';
@Injectable()
export class UsersService {
getCats() {
return new CatsService().findAll();
}
}然而,它似乎很好,因为当我走到path localhost:3000/users/get-cats时,我实际上可以看到所有的猫。
我期望得到类似must import x inside y to access this service的东西,或者任何阻止我这样做的错误。有什么我错过或不明白的吗?
编辑:
我没有遵循的是正式文档中的特殊线路:
In order to do that, we first need to export the CatsService provider by adding it to the module's exports array. Now any module that imports the CatsModule has access to the CatsService and will share the same instance with all other modules that import it as well.
发布于 2022-11-22 08:20:56
你说得对,这是完全可能的。但问题是这样做是否一个好主意?
基本上,您刚刚创建了CatsService类的一个新实例。你当然能做到。显然,没有什么可以阻止您执行这种简单的类型记录逻辑。尽管如此,CatsService不会是一个可以注入到其他服务中的单例。您已经创建了自己的实例,不再受益于依赖注入(由NestJS提供)。
如果希望将依赖项传递给CatsService构造函数,会发生什么情况?您还必须在自己创建CatsService (new CatsService(...dependencies))的地方传递它们。
基本上,NestJS可以看作是一个框架,以便根据传递给类的注释来处理依赖关系。您可以直接忽略注释,自己处理依赖项注入。然而,这将导致NestJS提供的方便的特性被删除。这样,您还需要处理创建单例的逻辑(如果要确保将这些类实例化为singletons)。
示例:
在应用程序中多次调用new CatsService()将导致创建该类的许多实例。将服务传递给像constructor(catsService: CatsService)这样的构造函数将导致创建一个实例,然后将这个单个实例注入到不同的其他对象中。
https://stackoverflow.com/questions/74529254
复制相似问题