メインコンテンツまでスキップ

モジュール

概要

モジュールは@Module()デコレーターで注釈されたクラスです。@Module()デコレーターはアプリケーション構造を整理するメタデータを提供します。モジュールは関連する機能をカプセル化し、NestJSのモジュールパターンに従います。

モジュール構造

MBC CQRS Serverlessの一般的なモジュールには以下が含まれます:

import { Module } from '@nestjs/common';
import { CommandModule } from '@mbc-cqrs-serverless/core';

import { CatController } from './cat.controller';
import { CatService } from './cat.service';
import { CatDataSyncRdsHandler } from './handler/cat-rds.handler';

@Module({
imports: [
CommandModule.register({
tableName: 'cat',
dataSyncHandlers: [CatDataSyncRdsHandler],
}),
],
controllers: [CatController],
providers: [CatService],
exports: [CatService],
})
export class CatModule {}

モジュールコンポーネント

コンポーネント説明
importsこのモジュールで使用するプロバイダーをエクスポートするインポート済みモジュールのリスト
controllersHTTPリクエストを処理するコントローラー
providersインジェクションに利用可能なサービスやその他のプロバイダー
exportsこのモジュールをインポートするモジュールで利用可能にすべきプロバイダー

フレームワークモジュール

MBC CQRS Serverlessはすぐに使えるモジュールをいくつか提供しています:

コアモジュール

モジュールパッケージ用途
CommandModule@mbc-cqrs-serverless/coreCQRSコマンド処理とデータ同期
SequenceModule@mbc-cqrs-serverless/sequence連番ID生成
TenantModule@mbc-cqrs-serverless/tenantマルチテナント管理

機能モジュール

モジュールパッケージ用途
TaskModule@mbc-cqrs-serverless/taskStep Functionsによる非同期タスク実行
MasterModule@mbc-cqrs-serverless/masterマスターデータと設定の管理
ImportModule@mbc-cqrs-serverless/importCSV/APIデータインポート

サポートモジュール

モジュールパッケージ用途
NotificationModule@mbc-cqrs-serverless/coreSES経由のメール通知
SettingModule@mbc-cqrs-serverless/ui-settingユーザーインターフェース設定の保存

動的モジュール登録

ほとんどのフレームワークモジュールは設定を受け付ける動的モジュールです:

CommandModule

CommandModule.register({
tableName: 'cat',
dataSyncHandlers: [CatDataSyncRdsHandler],
skipError: false,
disableDefaultHandler: false,
})
オプションデフォルト説明
tableNamestring必須DynamoDBテーブル名(接尾辞なし)
dataSyncHandlersType[][]データ同期ハンドラークラス
skipErrorbooleanfalseデータ同期中のエラーをスキップ
disableDefaultHandlerbooleanfalseデータテーブルへのデフォルトデータ同期を無効化

SequenceModule

SequenceModule.register({
enableController: true,
})

MasterModule

MasterModule.register({
enableController: true,
})

カスタムモジュールの作成

ステップ1: モジュールファイルの作成

// src/order/order.module.ts
import { Module } from '@nestjs/common';
import { CommandModule } from '@mbc-cqrs-serverless/core';
import { SequenceModule } from '@mbc-cqrs-serverless/sequence';

import { OrderController } from './order.controller';
import { OrderService } from './order.service';
import { OrderDataSyncHandler } from './handlers/order-data-sync.handler';

@Module({
imports: [
CommandModule.register({
tableName: 'order',
dataSyncHandlers: [OrderDataSyncHandler],
}),
SequenceModule.register({
enableController: false,
}),
],
controllers: [OrderController],
providers: [OrderService],
exports: [OrderService],
})
export class OrderModule {}

ステップ2: AppModuleへの登録

// src/app.module.ts
import { Module } from '@nestjs/common';
import { OrderModule } from './order/order.module';

@Module({
imports: [OrderModule],
})
export class AppModule {}

ベストプラクティス

  1. エンティティごとに1つのモジュール: 各ビジネスエンティティ用の専用モジュールを作成する
  2. コントローラーではなくサービスをエクスポート: 他のモジュールが必要とするプロバイダーのみをエクスポートする
  3. グローバルモジュールにはforRootを使用: AppModuleでグローバル設定を一度だけ登録する
  4. モジュールを焦点を絞った状態に保つ: 各モジュールは単一の責任を持つべき

関連ドキュメント