最近、AppModule を動的モジュールに変換して、コンテキスト (E2E テストなど) に応じて MikroOrm にさまざまな構成を提供できるようにしました。現在は次のようになっています。
@Module({
imports: [
MikroOrmModule.forFeature({
entities: [Todo],
}),
],
providers: [TodoService],
controllers: [AppController, TodosController],
})
export class AppModule {
static register(options?: {
mikroOrmOptions?: MikroOrmModuleOptions;
}): DynamicModule {
return {
module: AppModule,
imports: [
MikroOrmModule.forRoot({
entities: [Todo],
type: 'postgresql',
host: process.env.DB_HOST,
port: process.env.DB_PORT ? parseInt(process.env.DB_PORT) : 5432,
user: process.env.DB_USER,
password: process.env.DB_PASS,
dbName: process.env.DB_DB,
...options?.mikroOrmOptions,
}),
],
};
}
}
現在、データベースから切断してアプリを正常にシャットダウンしようとしていますが、この場合、ライフサイクルフックを配置する場所がわかりません。ライフサイクル フックを備えた動的モジュールを使用することはできないようです。そのため、orm を注入してフックを記述する別のプロバイダーを開発することを考えています。
正しいアプローチは何でしょうか?ありがとう。
編集:
次の解決策を思いつきました。これが最善の方法であるかどうかを誰かに示していただければ幸いです。
import { MikroORM } from 'mikro-orm';
...
@Module({
imports: [
MikroOrmModule.forFeature({
entities: [Todo],
}),
],
providers: [TodoService],
controllers: [AppController, TodosController],
})
export class AppModule implements OnModuleDestroy {
static register(options?: {
mikroOrmOptions?: MikroOrmModuleOptions;
}): DynamicModule {
return {
module: AppModule,
imports: [
MikroOrmModule.forRoot({
entities: [Todo],
type: 'postgresql',
host: process.env.DB_HOST,
port: process.env.DB_PORT ? parseInt(process.env.DB_PORT) : 5432,
user: process.env.DB_USER,
password: process.env.DB_PASS,
dbName: process.env.DB_DB,
...options?.mikroOrmOptions,
}),
],
};
}
constructor(private orm: MikroORM) {}
async onModuleDestroy(): Promise<void> {
await this.orm.close();
}
}