NestJSでモジュール(Modules)を作成および管理する:モジュール間の依存関係と通信
- 912単語
- 5分
- 09 Jul, 2024
モジュールはNestJSのコアビルディングブロックであり、コードを整理し依存関係を管理するのに役立ちます。この記事では、NestJSでモジュールを作成および管理する方法について説明し、モジュール間の依存関係と通信を探り、複雑なプロジェクトにおけるモジュールの組織化と依存管理を示すサンプルコードを提供します。
モジュールの作成と組織化
モジュールの作成
NestJSでは、モジュールはデコレーター @Module()
を使用して定義されます。以下の例は、シンプルな UsersModule
を作成する方法を示しています:
1import { Module } from "@nestjs/common";2import { UsersService } from "./users.service";3import { UsersController } from "./users.controller";4
5@Module({6 providers: [UsersService],7 controllers: [UsersController],8})9export class UsersModule {}
モジュールの組織化
典型的なNestJSプロジェクトには複数のモジュールが含まれ、それぞれが異なる機能を担当します。例えば、AuthModule
は認証を処理し、ProductsModule
は製品管理を処理します。
1import { Module } from "@nestjs/common";2import { UsersModule } from "./users/users.module";3import { AuthModule } from "./auth/auth.module";4import { ProductsModule } from "./products/products.module";5
6@Module({7 imports: [UsersModule, AuthModule, ProductsModule],8})9export class AppModule {}
モジュール間の依存関係
モジュールのエクスポートとインポート
モジュールは exports
プロパティを使用して提供するサービスをエクスポートでき、他のモジュールがこれらのサービスをインポートして使用できます。以下の例は、UsersService
をエクスポートし、AuthModule
で UsersModule
をインポートする方法を示しています:
1import { Module } from "@nestjs/common";2import { UsersService } from "./users.service";3import { UsersController } from "./users.controller";4
5@Module({6 providers: [UsersService],7 controllers: [UsersController],8 exports: [UsersService], // UsersServiceをエクスポート9})10export class UsersModule {}11
12// auth/auth.module.ts13import { Module } from "@nestjs/common";14import { AuthService } from "./auth.service";15import { UsersModule } from "../users/users.module";16
17@Module({18 imports: [UsersModule], // UsersModuleをインポート19 providers: [AuthService],20})21export class AuthModule {}
モジュール間の通信
モジュール間の通信は通常、サービスを介して行われます。例えば、AuthService
は UsersService
を呼び出してユーザーを検証できます:
1import { Injectable } from "@nestjs/common";2import { UsersService } from "../users/users.service";3
4@Injectable()5export class AuthService {6 constructor(private readonly usersService: UsersService) {}7
8 async validateUser(username: string, pass: string): Promise<any> {9 const user = await this.usersService.findOne(username);10 if (user && user.password === pass) {11 return user;12 }13 return null;14 }15}
複雑なプロジェクトにおけるモジュールの組織化と依存管理
複雑なプロジェクトでは、モジュールの組織化と依存管理が特に重要です。以下は、いくつかのベストプラクティスです:
フィーチャーモジュールを使用する
機能関連のコードをフィーチャーモジュールに整理します。例えば、ユーザー関連のすべてのコードを UsersModule
に、製品関連のすべてのコードを ProductsModule
に配置します。
共有モジュールを使用する
共通のサービス、パイプ、ガードなどを共有モジュールに配置し、必要な場所でインポートします。例えば、データベース接続やログサービスを提供する SharedModule
を作成できます。
1import { Module } from "@nestjs/common";2import { DatabaseService } from "./database.service";3import { LoggerService } from "./logger.service";4
5@Module({6 providers: [DatabaseService, LoggerService],7 exports: [DatabaseService, LoggerService],8})9export class SharedModule {}10
11// app.module.ts12import { Module } from "@nestjs/common";13import { SharedModule } from "./shared/shared.module";14import { UsersModule } from "./users/users.module";15import { AuthModule } from "./auth/auth.module";16
17@Module({18 imports: [SharedModule, UsersModule, AuthModule],19})20export class AppModule {}
モジュール間の依存性注入を使用する
依存性注入機構を使用して、モジュール間の緩い結合を確保します。例えば、サービスをモジュール内部で直接インスタンス化するのではなく、コンストラクタを通じて注入します。
1import { Injectable } from "@nestjs/common";2import { DatabaseService } from "../shared/database.service";3
4@Injectable()5export class ProductsService {6 constructor(private readonly databaseService: DatabaseService) {}7
8 async findAll(): Promise<any[]> {9 return this.databaseService.query("SELECT * FROM products");10 }11}
まとめ
この記事を通じて、NestJSでモジュールを作成および管理する方法について学び、モジュール間の依存関係と通信を探り、複雑なプロジェクトにおけるモジュールの組織化と依存管理を示すサンプルコードを提供しました。