gpt4 book ai didi

nestjs - 如何使动态模块成为全局模块?

转载 作者:行者123 更新时间:2023-12-04 10:59:12 24 4
gpt4 key购买 nike

在我的应用程序中,我想在整个项目中使用服务类的单个实例。服务类将由动态模块初始化。

事情详解

我有一个名为 LoggerModule 的模块,它有一个静态函数寄存器。我们使用这个方法在app模块中进行初始化,例如:LoggerModule.register(options)。在 register 方法中,我们将返回一个动态模块,它将将此选项设置为自定义提供程序。
例如:

return {
module: LoggerModule,
providers: [
{
provide: CONFIG_OPTIONS,
useValue: options,
},
LoggerService,
],
exports: [LoggerService],
};

这里我们有一个注入(inject) CONFIG_OPTIONS 的 LoggerService,以便我们可以使用服务类获取选项。现在我希望能够通过在我的类中注入(inject)它来从项目中的任何地方访问该服务,但由于该模块不是全局的,目前我必须在我正在使用的所有模块中包含 LoggerModule.register()。我尝试使用 @Global() 注释,但它似乎不起作用。

你能建议任何关于如何做到这一点的方法吗?如果是,请与我分享一个例子?

最佳答案

使动态模块全局化所需要做的就是添加 @Global() @Module() 上方的装饰器装饰师。与您正在使用的任何其他模块相同。 Here are the docs on it

编辑 2019 年 11 月 22 日

好的,我尝试尽可能接近地模仿您的设置,其中包含给定的内容以及我仍然躺在本地机器周围的内容。我能够获得一个使用以下设置的全局模块:

配置模块(什么是全局模块)

import { DynamicModule, Module, Provider, Global } from '@nestjs/common';
import { CONFIG_MODULE_OPTIONS } from './config.constants';
import { createConfigProvider } from './config.provider';
import { ConfigService } from './config.service';
import {
ConfigModuleAsyncOptions,
ConfigModuleOptions,
ConfigOptionsFactory,
} from './interfaces/config-options.interface';

@Global()
@Module({})
export class ConfigModule {
static forRoot(options: ConfigModuleOptions): DynamicModule {
return {
module: ConfigModule,
providers: [ConfigService, ...createConfigProvider(options)],
exports: [ConfigService],
};
}

static forRootAsync(options: ConfigModuleAsyncOptions): DynamicModule {
return {
module: ConfigModule,
imports: options.imports || [],
providers: [ConfigService, ...this.createAsyncProviders(options)],
exports: [ConfigService],
};
}

private static createAsyncProviders(
options: ConfigModuleAsyncOptions,
): Provider[] {
if (options.useExisting || options.useFactory) {
return [this.createAsyncOptionsProviders(options)];
}
if (options.useClass) {
return [
this.createAsyncOptionsProviders(options),
{
provide: options.useClass,
useClass: options.useClass,
},
];
}
throw new Error('Invalid ConfigModule configuration.');
}

private static createAsyncOptionsProviders(
options: ConfigModuleAsyncOptions,
): Provider {
if (options.useFactory) {
return {
provide: CONFIG_MODULE_OPTIONS,
useFactory: options.useFactory,
inject: options.inject || [],
};
}
return {
provide: CONFIG_MODULE_OPTIONS,
useFactory: async (optionsFactory: ConfigOptionsFactory) =>
await optionsFactory.createConfigOptions(),
inject: [options.useExisting || options.useClass || ''],
};
}
}

我为一个完全可重用的 Nest Module 设置了这个,但放弃了这个想法,因为那里已经有一些配置模块,因此都是样板文件。

动态模块(是的,我知道拼写错误)

import { Module } from '@nestjs/common';
import { DyanmicTestService } from './dyanmic-test.service';
import { DyanmicTestController } from './dyanmic-test.controller';

@Module({
providers: [DyanmicTestService],
controllers: [DyanmicTestController],
})
export class DyanmicTestModule {}

Dyanmic Service 注入(inject)了 Config Service,但请注意我们这里没有导入 Config Module。那是因为它是全局的,一旦在 App Module 中注册,就不需要在其他任何地方导入。

应用模块

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { DyanmicTestModule } from './dyanmic-test/dyanmic-test.module';
import { ConfigModule } from './config/config.module';

@Module({
imports: [
ConfigModule.forRootAsync({
useFactory: () => ({
fileName: '.env',
useProcess: false,
}),
}),
DyanmicTestModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}

所有这些代码 can also be found on my GitHub .

关于nestjs - 如何使动态模块成为全局模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58948273/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com