2025-03-29

InversifyJSを使って依存注入を学ぶ

依存注入(DI)とは?

オブジェクトが依存するインスタンスを自分で生成するのではなく、外部から注入することで、オブジェクト間の依存関係を解消する設計パターンのことです。 DIを使うことで、オブジェクト間の結合度を下げ、テストしやすいコードを書くことができます。

具体的な例をみて、DIのメリットを確認します。

依存下院系を外部で設定できるようにすることで、CarクラスはEngineの生成を自分でしないため、他のEngine実装(例:ElectricEngine)を簡単に差し替えることができます。 また、テストに時にはMockEngineクラスを注入することで、テストしやすいコードに変更することもできます。

InversifyJSとは?

https://inversify.io/ InversifyJSとは、TypeScript向けのDIコンテナです。 InversifyJSを使うことで、依存関係を自動で解決することができます。 まずは使い方をみていきましょう。

InversifyJSを使って依存注入をする方法

@injectableデコレータを使うことで、KatanaNinjaクラスをDI可能なクラスに変更します。 @injectデコレータを使うことで、NinjyaクラスがKatanaクラスを依存していることを示します。 container.bindメソッドを使うことで、クラスと実装のバインドを行います。 container.getメソッドを使うことで、DIコンテナからインスタンスを取得します。

イメージ的には、外部依存のクラスをcontainer.bindメソッドで外部依存を登録して、container.getメソッドで外部依存が設定されたインスタンスを取得するという感じです。

InversifyJSの機能

ここからは、InversifyJSの機能について詳しくみていきます。 この機能をみていくことで、DIについて理解を深めることができます。

Binding

Bindingは、クラスと外部依存のクラスをバインドする機能です。 Bindingをすることで、コンテナに追加され、container.getメソッドでインスタンスを取得することができます。

tsconfig.jsonemitDecoratorMetadataオプションを有効にすることで、@injectデコレータを使わずにバインドすることもできます。

  • emitDecoratorMetadataとは? emitDecoratorMetadataは、クラスの型情報(メタデータ)をコンパイル時に生成して出力するためのオプションです。オプションを有効にすることで、デコレータのメタデータを出力することができます。 https://qiita.com/SoraKumo/items/1e05c68e9add1d62690a
  • reflect-metadataとは? メタデータを操作するためのライブラリです。個のライブラリは実行時に自分自身の構造を調べたり操作したりする機能を実現するために私用されます https://qiita.com/shibukawa/items/35a84ceb12923782d03e

bindingのScope scopeはインスタンスを生成するときのキャッシュ戦略を指定することができます。

  1. Request classの中で同じオブジェクトを使う場合は同じインスタンスを使う
  2. Singleton container.getをしたときにすでにキャッシュ済みのインスタンスがある場合はキャッシュ済みのインスタンスを使う
  3. Transient 常に新しいインスタンスを生成する

DI Hierarchy

それぞれのコンテナには親コンテナを持たせることができます。 親コンテナを持たせることで、アプリの関心を分割しすることができ、より柔軟なDI設計を行うことができます。 依存が注入されたときに、InversifyJSは現在のコンテナから親コンテナに向かって依存を探しに行きます。

DI Hierarchyを使うことで、複雑な依存関係を管理し、コードをクリーンに保つことができます。

Lifecycle

Activation Activationは、インスタンスが生成されるときにるときにonActivationメソッドを使ってインスタンスに対して処理を行うことができます。

Deactivation Deactivationは、インスタンスが破棄されるときにonDeactivationメソッドを使ってインスタンスに対して処理を行うことができます。

Snapshot

Snapshotは、コンテナの状態を保存する機能です。 Snapshotを使うことで、コンテナの状態を保存して、後で復元することができます。 この機能はデバッグやテスト、コンテナの変更を監視したいときに便利です。

Thanks for the visit Nozo Blog