🥺

NestJSのDIを楽にするライブラリを作った

2022/06/28に公開

@nestjs-modular/inject

https://github.com/Karibash/nestjs-modular/tree/main/packages/inject
https://www.npmjs.com/package/@nestjs-modular/inject

RepositoryやUseCase等が増えるたびに、毎回手動でDIするのが面倒なのでディレクトリまるごとDI出来るライブラリを作っちゃいました。

使用例はこちら
https://github.com/Karibash/nestjs-modular/tree/main/examples/inject

DI毎回手書きするのめんどくさい

import { Module } from '@nestjs/common';

@Module({
  providers: [
    UserCreateUseCase,
    UserDeleteUseCase,
  ],
  exports: [
    UserCreateUseCase,
    UserDeleteUseCase,
  ],
  controllers: [
    TasksController,
  ],
})
export class UsersModule {}

エンドポイント増える前にこんな感じのコード書いてませんか?
新しくUseCase増えた際にDIするの忘れてて、ビルドエラーになったり・・・

ディレクトリ指定してまるごとDIしちゃおう

import { Module } from '@nestjs/common';
import { InjectConditions, InjectModule } from '@nestjs-modular/inject';
import path from 'path';

const useCases: InjectConditions = {
  path: path.resolve(__dirname, './usecases'),
  includeFileNames: [/\.usecase$/],
  includeExportNames: [/UseCase$/],
};

@Module({
  imports: [
    InjectModule.forRootAsync({
      providers: useCases,
      exports: useCases,
    }),
  ],
  controllers: [
    TasksController,
  ],
})
export class UsersModule {}

@nestjs-modular/injectを使うとディレクトリ指定でまるごとDIできちゃいます。
UseCaseが増えても勝手にDIしてくれるので、凡ミスでビルドエラーになる事も無くなります。

仕組み

内部的にはディレクトリを再帰的に探索して、dynamic importするような仕組みになっています。
(指定ディレクトリにファイルが多いと重すぎて使えないかも・・・)

https://github.com/Karibash/nestjs-modular/blob/9ae07582a422122c61d06eaf17a8d3187d8e6857/packages/inject/src/index.ts#L38-L53

Discussion