Nest.js - Module

2020-07-10  本文已影响0人  stevekeol
模块
只有根模块的简单项目 形成模块树的复杂项目
模块的结构

@Module装饰器接受一个描述模块属性的对象

@module({
  import: [UserOrgModule, TypeOrmModule.forFeature([User])],
  providers: [AuthService],
  controllers: [AuthController]
})
功能模块

CatsController和CatsService属于同一个应用程序域,因此放在同一个功能模块CatsModule下面。

//cats/cats.module.ts
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})
export class CatsModule {}
//通过cli方式创建module
$ nest g module cats 
//有根模块ApplicationModule和CatsModule两个模块之后的典型的目录结构:
src
├──cats
│    ├──dto
│    │   └──create-cat.dto.ts
│    ├──interfaces
│    │     └──cat.interface.ts
│    ├─cats.service.ts
│    ├─cats.controller.ts
│    └──cats.module.ts
├──app.module.ts
└──main.ts
共享模块

实际上每一个模块都是共享模块。即一旦创建就能被任意模块重复使用。当需要在几个模块间共享实例CatsService,需要把该实例放在exports数组中。
这样每个导入CatsModule的模块都可以访问CatsService,且共享CatsService实例。

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService]
})
export class CatsModule {}
模块导出

模块不仅可以导出自身的Provider,还可以再导出自己导入的模块

@Module({
  imports: [CommonModule],
  exports: [CommonModule],
})
export class CoreModule {}
依赖注入
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})
export class CatsModule {
  constructor(private readonly catsService: CatsService) {}
}
全局模块
import { Module, Global } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Global()
@Module({
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService],
})
export class CatsModule {}
动态模块 --- ???
//DatabaseModule的定义
import { Module, DynamicModule } from '@nestjs/common';
import { createDatabaseProviders } from './database.providers';
import { Connection } from './connection.provider';

@Module({
  providers: [Connection], //默认情况下,Connection在@Module()装饰器元数据中定义Provider。
})
export class DatabaseModule {
  static forRoot(entities = [], options?): DynamicModule {
    const providers = createDatabaseProviders(options, entities);
    return {
      //global: true //在全局范围内注册动态模块
      module: DatabaseModule,
      providers: providers,
      exports: providers,
    };
  }
}
// DatabaseModule的导入和使用
import { Module } from '@nestjs/common';
import { DatabaseModule } from './database/database.module';
import { User } from './users/entities/user.entity';

@Module({
  imports: [DatabaseModule.forRoot([User])],
})
export class AppModule {}
//依次重新导出动态模块
 import { Module } from '@nestjs/common';
import { DatabaseModule } from './database/database.module';
import { User } from './users/entities/user.entity';

@Module({
  imports: [DatabaseModule.forRoot([User])],
  exports: [DatabaseModule],
})
export class AppModule {} 
上一篇 下一篇

猜你喜欢

热点阅读