框架如何管理 DynamicModules 的生命周期?
一般来说,就像它做任何其他模块一样。动态模块只是由函数配置并由对象表示的模块的特殊名称。最终结果通常类似于
{
module: SomeModuleClass,
imports: [Imports, For, The, Module],
providers: [SomeProviderToken, SomeProviderService, ExtraProvidersNeeded],
exports: [SomeProviderService],
}
与您在 @Module() 装饰器中看到的几乎相同,但通过可能使用 DI 而不是直接编写的函数进行配置
如何在模块之间共享多个动态模块实例?
我可能需要在这里澄清一下,但是一旦我知道这里的目标是什么,或者你想要做什么,我会很乐意更详细地编辑我的答案。
您如何管理/更改 DynamicModules 的范围?例如,将它们从传递行为更改为单例。定义它们的注入令牌,按需检索它们等。
共享您的配置(除了创建模块@Global())最简单的选择是创建一个包装器模块,该模块在配置后重新导出动态模块。
示例:假设我们有一个动态的FooModule,我们想将application 传递给它,以指定应用程序的名称,并且我们想在其他几个地方重用该模块
@Module({
imports: [
FooModule.forRoot(
{ application: 'StackOverflow Dynamic Module Scope Question' }
)
],
exports: [FooModule],
})
export class FooWrapperModule {}
现在我们不再在多个地方再次导入FooModule.forRoot(),而是导入FooWrapperModule,并获得与最初传递的配置相同的FooService实例。
我想提一下,按照惯例,DynamicModule.forRoot/Async()通常意味着在RootModule 中进行单次注册,通常有一个@Global() 或isGlobal: true配置附加到它的某个地方。情况并非总是如此,但它相对正确。
DynamicModule.register/Async() 另一方面,通常意味着我们正在为这个模块配置一个动态模块仅为这个模块,它可以在别处重新配置以拥有自己的单独配置. This can lead to cool setups where you can have multiple JwtService instances that have different secret values for signing (like for an access and refresh token signing service).
然后是DynamicModule.forFeature(),它类似于register,因为它是基于每个模块的,但通常它使用来自已经进行的forRoot/Async() 调用的配置。 @nestjs/typeorm 模块、mikro-orm/nestjs 模块和@ogma/nestjs-module 模块是我能想到的三个独立示例,它们遵循这种模式。这是允许在根级别进行一般配置(应用程序名称、数据库连接选项等)然后允许在模块级别进行范围配置(将注入哪些实体、记录器上下文等)的好方法