我正在开发一个 NestJS 项目。这是我的项目结构:
-src
-config
-configuration.ts
-modules
-auth
-user
-utils
-util.ts
Run Code Online (Sandbox Code Playgroud)
在我的身份验证和用户模块中,我导入ConfigModule,然后可以使用它ConfigService从 configuration.ts 文件中获取配置值。
但是如何获取utils/util.ts文件中的配置值?
它只是一个保存一些帮助文件的目录,而不是模块目录。
假设您希望ConfigService使用相同的实例...从 NestJS 的角度来看,我看到两个选项:
util到单个 Provider 中,并将其视为 NestJS 应用程序的合法组件(或者按职责将它们分组到多个 Provider 中,这也更有意义)util声明为自定义。Provider关于第二个选项:
\n\n// regular typescript class\n// exported so you can type your injected "configService" in other classes\nexport class ConfigService {\n // your code\n}\n\nexport default new ConfigService();\nRun Code Online (Sandbox Code Playgroud)\n\n这可以按原样导入util。
\n并通过创建自定义提供程序注入到您的 NestJS 应用程序中:
import configService, { ConfigService } from \'./somewhere/config-service.ts\';\n\nconst configServiceProvider = {\n provide: ConfigService,\n useValue: configService,\n};\n\n// and use it in your ConfigModule\n@Module({ \n providers: [configServiceProvider],\n exports: [configServiceProvider],\n})\nexport class ConfigModule {}\nRun Code Online (Sandbox Code Playgroud)\n\n当注入ConfigServiceNestJS 应用程序时,该值将被解析为configService(显然,只要ConfigModule在范围内)。
但是,这不允许您ConfigService在其构造函数参数中注入任何内容...除非您准备好使用两个不同的实例ConfigService(一个用于util,一个用于您的 NestJS 应用程序)。在这种情况下,您可以使用 Factory 提供程序,如下所示:
const configServiceProvider = {\n provide: ConfigService,\n useFactory: (somethingService: SomethingService) => new ConfigService(somethingService),\n inject: [SomethingService],\n};\n\n// and in the ConfigModule\n@Module({\n imports: [SomethingModule], // so you can inject SomethingService\n providers: [configServiceProvider],\n exports: [configServiceProvider],\n})\nexport class ConfigModule {}\nRun Code Online (Sandbox Code Playgroud)\n\n但这没有多大意义,因为您还需要 NestJS 范围之外的 available 依赖项,ConfigService以便在函数中使用它。util
另一种选择(不考虑任何框架)是允许您自己传递(通过参数)... 例如ConfigService:util
// old version\nexport const readDeploymentConfigFile = (filePath: string) => {\n // ...\n};\n\n// new version\nexport const readDeploymentConfigFile = (configService: ConfigService) => (filePath: string) => {\n // ...\n};\nRun Code Online (Sandbox Code Playgroud)\n\n该视频可能会鼓舞人心(“Dead-Simple Dependency Injection”,作者:R\xc3\xbanar\xc3\x93li Bjarnason,2012),即使它与 TypeScript 或 Nest 无关。
\n\n但这对于用作 API 来说并不理想,而且还可能会暴露一些设计缺陷...如果您的util函数需要一些动态/外部配置值,我们仍然可以将它们视为util函数吗?
| 归档时间: |
|
| 查看次数: |
8615 次 |
| 最近记录: |