コンストラクターインジェクション
コンストラクターを通じて依存関係をすっきり注入します。
「コンストラクターインジェクション」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。
コンストラクターインジェクションを詳しく見る
コンストラクターインジェクションでは、すべての依存関係をコンストラクターの引数として宣言します。オブジェクトは存在した瞬間に完全に接続されるため、必須の依存オブジェクトを渡し忘れることがありません。
パラメータープロパティ
TypeScriptでは、引数にアクセス修飾子を付けることで、依存関係の宣言と代入を1つの手順で行えます。private readonlyを指定すると、フィールドが自動的に作成され、値が代入されます。
interface Mailer { send(to: string, body: string): void; }
class Notifier {
constructor(private readonly mailer: Mailer) {}
}インターフェースに基づく依存関係
クラスではなくインターフェースに依存すると、利用側を特定の実装から切り離せます。インターフェースに一致するオブジェクトであれば、どれでも渡せます。
interface Mailer { send(to: string, body: string): void; }
class SmtpMailer implements Mailer {
send(to: string, body: string) { console.log("SMTP ->", to); }
}コンポジションルートで接続する
オブジェクトグラフを生成する場所をコンポジションルートと呼びます。そこで具体的な実装を選び、注入します。
class Notifier {
constructor(private readonly mailer: Mailer) {}
notify(to: string) { this.mailer.send(to, "hello"); }
}
const app = new Notifier(new SmtpMailer());
app.notify("a@b.com");実装を入れ替える
依存関係がインターフェースであるため、Notifierに触れずにまったく異なる実装を渡せます。これがDIによって得られる中核的な柔軟性です。
class FakeMailer implements Mailer {
sent: string[] = [];
send(to: string) { this.sent.push(to); }
}
const fake = new FakeMailer();
new Notifier(fake).notify("x@y.com");
console.log(fake.sent); // ["x@y.com"]実際のI/Oなしでテストする
フェイクのメーラーを注入すると、実際にメールを送信せずに、送信されるはずの内容をテストで検証できます。テストは高速で決定的になり、単独で実行できます。
const fake = new FakeMailer();
new Notifier(fake).notify("test@site");
console.log(fake.sent.length === 1); // true複数の依存関係
必要な数だけ依存関係を列挙できます。それぞれが明示的に型付けされた必須項目になるため、クラスの要件をひと目で把握できます。
interface Logger { log(m: string): void; }
class Notifier {
constructor(
private readonly mailer: Mailer,
private readonly logger: Logger,
) {}
}readonlyで再代入を防ぐ
注入したフィールドにreadonlyを指定すると、オブジェクトの存続中に別の値へ置き換えることを防ぎ、依存するオブジェクトを安定して予測可能な状態に保てます。
class Notifier {
constructor(private readonly mailer: Mailer) {}
// this.mailer = ... would be a compile error
}内部に隠れたnewを置かない
コンストラクターインジェクションを使用するクラスは、依存するオブジェクトを内部でnewしてはいけません。すべての依存関係をコンストラクターから受け取ることで、結合関係を明示できます。
必須とオプション
必須の依存関係はコンストラクターに置きます。本当にオプションの依存関係には、何もしない実装をデフォルトとして指定できます。ただし、それも内部で構築せず、外部から渡します。
const noopLogger: Logger = { log() {} };
new Notifier(new SmtpMailer(), noopLogger);メリットのまとめ
コンストラクターインジェクションによって、依存関係が明示され、オブジェクトが完全に初期化され、実装を交換でき、テストも簡単になります。これが、適切な理由があってDIの標準的なスタイルになっている方法です。
クイックチェック
このレッスンの理解度を確認します。
まとめ
コンストラクターインジェクションでは、インターフェースで型付けした依存関係を引数として宣言します(多くの場合はprivate readonlyを使用します)。コンポジションルートが実装を選び、テストではフェイクを渡します。オブジェクトは常に完全に接続され、クラスを編集せずに依存するオブジェクトを交換できます。
よくある質問
「コンストラクターインジェクション」レッスンは無料ですか?
はい。「コンストラクターインジェクション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。
「コンストラクターインジェクション」で何を学びますか?
コンストラクターを通じて依存関係をすっきり注入します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
TypeScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「コンストラクターインジェクション」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このTypeScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 制御の反転の基礎
- コンストラクターインジェクション
- InversifyJSによるDIコンテナ
- 型安全なサービスToken