Nest Module

概述

模块是具有 @Module() 装饰器的类。@Module() 装饰器提供了元数据,可供 Nest 用于组织应用程序架构。

每个应用最少有个根模块。根模块用于 Nest 构建应用图(application graph)的起点。它包含内部的数据结构用于 Nest 解析模块和提供者间的关系和依赖。

@Module() 装饰器有如下属性

共享模块

在 Nest 中,默认情况下,模块是单例,可以轻松地在多个模块之间共享同一个提供者实例。 实际上,每个模块都是一个共享模块,一旦创建实例就能被任意模块重复使用。需将 provider(如 CatService) 添加到模块 exports 数组中。

全局模块

@Global() 装饰器使模块全局化。全局模块只能被注册一次,最好在根或核心模块。

@Global()
@Module({
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService]
});

动态模块

创建自定义模块,可动态注册和配置程序。动态模块返回的属性扩展而非覆盖 @Module 装饰器中定义的基本模块的元数据。

import { Module, DynamicModule } from '@nestjs/common';
import { createDatabaseProviders } from './database.providers';
import { Connection } from './connetion.provider';

@Module({
  providers: [Connection],
});

export class DatabaseModule {
  static forRoot(entities = [], options?): DynamicModule {
    const providers = createDatabaseProviders(options, entities);
    return {
      global: true, // 全局范围注册动态模块
      module: DatabaseModule,
      providers: providers,
      exports: providers,
    };
  }
}

// 导入及配置 DatabaseModule
@Module({
  imports: [DatabaseModule.forRoot([User])]
});
export class AppModule {}

// re-export 动态模块
@Module({
  imports: [DatabaseModule.forRoot([User])],
  exports: [DatabaseModule],
})