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
450
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
第3回NestJS勉強会 Dependency Injectionについて
DIとDIコンテナがNestJSでどのように役に立っているか、説明しました!
takuya.mashimo (眞下卓也)
June 25, 2022
More Decks by takuya.mashimo (眞下卓也)
See All by takuya.mashimo (眞下卓也)
第一回NestJS勉強会
sigcode1
0
230
Other Decks in Programming
See All in Programming
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
530
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
710
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
150
Pythonの実行はどこまで賢くなったのか? CPythonとPyPyから見る最適化のしくみ
curekoshimizu
0
130
レビュー履歴をAIに食わせて、 Compose移行を加速するs
shihochan
0
140
自動化したのに回らないテスト運用の壁ーAI時代の品質責任と生産性
mfunaki
1
140
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
230
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
210
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.4k
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
190
仕様駆動開発の消費期限
watany
20
8.7k
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
1.1k
Featured
See All Featured
How to Ace a Technical Interview
jacobian
281
24k
How STYLIGHT went responsive
nonsquared
100
6.2k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Practical Orchestrator
shlominoach
191
12k
Docker and Python
trallard
47
4.1k
The browser strikes back
jonoalderson
0
1.5k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
430
Facilitating Awesome Meetings
lara
57
7.1k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Raft: Consensus for Rubyists
vanstee
141
7.6k
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
ご清聴ありがとうございました🙇