Injection(DI)で自分で定義したServiceを各コンポーネントで使えるようにできます。Frameworkを筆頭に、インターフェイスに対してどのような実装を紐づけるかをDIで実現しています。サーバーサイドやCLIでNode.jsのアプリを作るとなると途端にDIをすることって少ないですよね。TypeScriptで型やインターフェイスを手に入れたのにClassをいちいちnewしたりimportするのは辛い...とても辛い!!このポストではInversifyJSを使ってサーバーサイドのNode.jsのアプリでDIを行います。実現したいことNode.jsアプリでDIを使ってInterfaceと実装クラスを疎結合にする。生のJSではなく、TypeScriptを使ってClassとInterfaceの恩恵を受ける。題材はCLIアプリケーションとする。InterfaceへのDIだけでなく、実装クラスのDIについてもやってみる。最近お仕事で自分でやったことを例とします。題材とシチュエーションは以下の通りです。した自動化アプリです。Framework)のWebAPIを作っています。入力チェックのテストコードを全項目網羅して正しく入力チェックエラーを返すことを確認したい。手で書いて目Grepで過不足がないか確認するのは効率がよくない&何かしら見落とすリスクがあるので自動生成する。この自動生成をCLIをインターフェイスとしたアプリケーションとして実装する。InversifyJS今回のように、JavaScript/TypeScriptでDIを実現するのに不可欠なライブラリです。github.com正体はTypeScriptで作られたIoCコンテナ(=DIコンテナ)のライブラリ。TypeScriptで使うことが推奨されています。最近のTypeScriptの流れなのか、アノテーションを使っています。@Injectや@InjectableといったJavaでもお馴染みのやつを使えます。最終形をお見せします。ファイル・ディレクトリは以下の通りになります。CLIのエントリーポイントがsrc/generator.tsです。各ディレクトリはクリーンアーキテクチャもどきで構成しています。各ディレクトリと格納クラスの役割は以下の通りです。controllerインターフェイス(=CLI)の入力をもとに、ユースケースを淡々と呼び出すだけです。usecaseビジネスロジックを組み合わせて、ユースケースを実現する部品をおきます。今回はユースケースとしてテストケースの生成を実現します。呼び出し側はユースケースのインターフェイス(UseCaseInterface.ts)にのみ依存します。businessビジネスロジックを入れます。ここだけInterfaceを定義せず、実装クラスのみ置いてます。repositoryデータストアへの入出力を行います。ファイルを扱うのか、DBを使うのかといった実装部分は呼び出し側には直接関係ないので、呼び出し側はRepositoryInterface.tsに定義したインターフェイスにのみ依存するようにします。common共通部品を入れます。Interfaceと実装クラスを紐づけるinversify.config.tsもこのディレクトリに突っ込んでます。Interfaceを定義するまずはController、UseCase、RepositoryのInterfaceを定義します。全部書いているとキリがないので一部だけ。CreateScriptResponse;}実装は何も入れていません。どのようにこのgenerate関数が実現されるかは実装クラスに委ねられます。使用する側は実装クラスではなく、Interfaceにのみ依存します。実装クラスを書くInterfaceを実装します。前述した通り、JavaのInjectアノテーションが出てきますね。使用すればあとはただのアプリです。Interfaceと実装クラスの紐付けを定義します。ここで紐付けはこのクラスでしか行いません。to()で実装クラスを紐づけるのですが、toSelf()なる関数があるらしい。Here!!まとめInversifyJSを使うと、Node.jsのアプリでもDIやるのは結構簡単ですね。今回はCLIアプリで一からコードを書きましたが、Webアプリでフレームワークを使うときも同じように書けるはず。Javaの関数を実装するあけましておめでとうございます。月別アーカイブはてなブログをはじめよう!accelerkさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。