Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
第3回NestJS勉強会 Dependency Injectionについて
Search
takuya.mashimo (眞下卓也)
June 25, 2022
Programming
0
420
第3回NestJS勉強会 Dependency Injectionについて
DIとDIコンテナがNestJSでどのように役に立っているか、説明しました!
takuya.mashimo (眞下卓也)
June 25, 2022
Tweet
Share
More Decks by takuya.mashimo (眞下卓也)
See All by takuya.mashimo (眞下卓也)
第一回NestJS勉強会
sigcode1
0
230
Other Decks in Programming
See All in Programming
Unicodeどうしてる? PHPから見たUnicode対応と他言語での対応についてのお伺い
youkidearitai
PRO
1
2.6k
AI Schema Enrichment for your Oracle AI Database
thatjeffsmith
0
330
今こそ知るべき耐量子計算機暗号(PQC)入門 / PQC: What You Need to Know Now
mackey0225
3
380
FOSDEM 2026: STUNMESH-go: Building P2P WireGuard Mesh Without Self-Hosted Infrastructure
tjjh89017
0
180
SourceGeneratorのススメ
htkym
0
200
Package Management Learnings from Homebrew
mikemcquaid
0
230
CSC307 Lecture 01
javiergs
PRO
0
690
責任感のあるCloudWatchアラームを設計しよう
akihisaikeda
3
180
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
620
CSC307 Lecture 03
javiergs
PRO
1
490
humanlayerのブログから学ぶ、良いCLAUDE.mdの書き方
tsukamoto1783
0
200
なるべく楽してバックエンドに型をつけたい!(楽とは言ってない)
hibiki_cube
0
140
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
77
5.3k
The Cult of Friendly URLs
andyhume
79
6.8k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
110
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
200
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
0
2.4k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Six Lessons from altMBA
skipperchong
29
4.2k
The Spectacular Lies of Maps
axbom
PRO
1
530
From π to Pie charts
rasagy
0
130
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
1
300
Transcript
第3回NestJS勉強会 Dependency Injectionを理解する 2022/06/23 taku@webエンジニア(@sig-code1)
Dependency Injectionとは?
「依存している部分を、外から注入する」 一言で表すと...
用語 ・依存性の注入 ・Dependency Injection ・DI(Dependency Injectionの略語)
NestJSではどの部分?
依存性を注入をしている部分
@InjectableデコレータをUserServiceClassにつ けることで、providersに登録可能 providers・・・Moduleの要素の1つ(他にImports,controllers,exportsなどがある)
NestJSのDIシステムによって、 UserServiceクラスがインスタンス化がされるように + Module内で使用できるようになる Module内・・・今回でいうとUsersControllerなどのUsersModuleに書かれたClassたちのこと
providersに登録したClassをconstructor引数に指定 →UsersServiceClassをインスタンス化 →UsersController内で使用できるように
NestJSを使わず、 DIを用いていないサンプルコード こんな感じに☞
user.ts database.ts index.ts コンソールに Save taku!を 出力するだけのコード メソッド内でクラスをインスタンス化
これを、DI対応をすると
user.ts database.ts index.ts コンソールに Save taku!を 出力するだけのコード 外からクラスを渡すように
あんまり、変化が... • Userクラスの外部からDatabaseクラスを渡すだけで、DIの 対応は完了 • 依存対象となるDatabaseクラス(dependency)を外部から 渡す・注入(injection)している ☞Dependency Injectionと呼ばれる
DIのメリットは 単体テストがしやすくなること なぜか DI対応前のコードの場合、Userクラスの単体テストをしようとすると... ☞Databaseクラスに依存しているため、テスト失敗時の原因の切り分けが難しい ☞それはもはや、単体テストと呼べるのか??
user.ts database.ts index.ts コンソールに Save taku!を 出力するだけのコード メソッド内でクラスをインスタンス化
まだ、問題はある
user.ts database.ts index.ts コンソールに Save taku!を 出力するだけのコード 外からクラスを渡すように
• Userクラスをインスタンス化する時 ☞Databaseクラスをインスタンス化して渡さないといけない ☞つまり、UserクラスはDatabaseクラスに依存しているこ とになる
これを解決するには?
• Userクラスをインスタンス化する時に、外からDatabaseク ラスをインスタンス化せずに動かしたい もう一度、言語化
user.ts database.ts index.ts コンソールに Save taku!を 出力するだけのコード ここの部分
• アプリ側では、求めるクラスを与えられば動くコードを書きた い • オブジェクト(クラス)に何が外から渡されるかを管理したく ない 抽象度を上げると...
DIコンテナ
• DIコンテナはDIをサポートするツールである • オブジェクト(クラス)やオブジェクトの生成方法を保持す る箱のようなもの • アプリケーション(実装者側)がDIコンテナから必要なクラ スを取り出すだけにする ざっくり
DI コンテナ Application (コード側) UserServiceクラスがほしい
DI コンテナ Application (コード側) 処理中.....
DI コンテナ Application (コード側) UserService インスタンスが生成されたかを知らず、 UserServiceを利用することができる
• DIコンテナは登録と取得 • 好きなオブジェクト(クラス)を登録 • 登録したオブジェクトを取得 簡単に言語化
NestJSをもう一度みてみる
None
None
まとめてみると
• DIはデザインパターン ☞依存している部分を外から渡す • DIコンテナ ☞DIを強く後押しするツール • デコレーターとModuleファイルを使用して登録 • 使いたいオブジェクト(Class)で取得
テストコードを見てみよう https://github.com/sig-code/nest-study
ご清聴ありがとうございました🙇