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
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
2.8k
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
860
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
190
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
6.4k
はてなアカウント基盤 State of the Union
cockscomb
1
1.3k
どこまでゆるくて許されるのか
tk3fftk
0
500
yield再入門 #phpcon
o0h
PRO
0
580
1年で人数1.5倍、PR数5.5倍増。 品質とアウトカムはどうなったか、 何が効いたか
ike002jp
0
140
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
0
230
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
170
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
170
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
110
Featured
See All Featured
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
150
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
240
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
410
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
260
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
410
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
The Spectacular Lies of Maps
axbom
PRO
1
860
ラッコキーワード サービス紹介資料
rakko
1
4M
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
360
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
ご清聴ありがとうございました🙇