Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
Yuki Matsumura
13,177 views
Dependency injection
Dependency InjectionとDagger2の基礎
Engineering
◦
Read more
6
Save
Share
Embed
Embed presentation
Download
Downloaded 17 times
1
/ 138
2
/ 138
3
/ 138
4
/ 138
5
/ 138
6
/ 138
7
/ 138
8
/ 138
9
/ 138
10
/ 138
11
/ 138
12
/ 138
13
/ 138
14
/ 138
15
/ 138
16
/ 138
17
/ 138
18
/ 138
19
/ 138
20
/ 138
21
/ 138
22
/ 138
23
/ 138
24
/ 138
25
/ 138
26
/ 138
27
/ 138
28
/ 138
29
/ 138
30
/ 138
31
/ 138
32
/ 138
33
/ 138
34
/ 138
35
/ 138
36
/ 138
37
/ 138
38
/ 138
39
/ 138
40
/ 138
41
/ 138
42
/ 138
43
/ 138
44
/ 138
45
/ 138
46
/ 138
47
/ 138
48
/ 138
49
/ 138
50
/ 138
51
/ 138
52
/ 138
53
/ 138
54
/ 138
55
/ 138
56
/ 138
57
/ 138
58
/ 138
59
/ 138
60
/ 138
61
/ 138
62
/ 138
63
/ 138
64
/ 138
65
/ 138
66
/ 138
67
/ 138
68
/ 138
69
/ 138
70
/ 138
71
/ 138
72
/ 138
73
/ 138
74
/ 138
75
/ 138
76
/ 138
77
/ 138
78
/ 138
79
/ 138
80
/ 138
81
/ 138
82
/ 138
83
/ 138
84
/ 138
85
/ 138
86
/ 138
87
/ 138
88
/ 138
89
/ 138
90
/ 138
91
/ 138
92
/ 138
93
/ 138
94
/ 138
95
/ 138
96
/ 138
97
/ 138
98
/ 138
99
/ 138
100
/ 138
101
/ 138
102
/ 138
103
/ 138
104
/ 138
105
/ 138
106
/ 138
107
/ 138
108
/ 138
109
/ 138
110
/ 138
111
/ 138
112
/ 138
113
/ 138
114
/ 138
115
/ 138
116
/ 138
117
/ 138
118
/ 138
119
/ 138
120
/ 138
121
/ 138
122
/ 138
123
/ 138
124
/ 138
125
/ 138
126
/ 138
127
/ 138
128
/ 138
129
/ 138
130
/ 138
131
/ 138
132
/ 138
133
/ 138
134
/ 138
135
/ 138
136
/ 138
137
/ 138
138
/ 138
More Related Content
PDF
Hello. Continuous Integration
by
Yuki Matsumura
PDF
UnitTest
by
Yuki Matsumura
PDF
DI(依存性注入)について
by
Yui Ito
PDF
快適・簡単・安心なアプリE2Eテストの実行環境 #stac2017
by
Yahoo!デベロッパーネットワーク
PDF
Jenkinsを用いたAndroidアプリビルド作業効率化
by
Kenichi Kambara
PPTX
Sansan における Android アプリ自動テスト導入事例
by
Kenichi Tatsuhama
PDF
Javaユーザに贈るJenkins 25のTips
by
Masanori Satoh
PDF
20121019 jenkins勉強会lt資料
by
Hiroko Tamagawa
Hello. Continuous Integration
by
Yuki Matsumura
UnitTest
by
Yuki Matsumura
DI(依存性注入)について
by
Yui Ito
快適・簡単・安心なアプリE2Eテストの実行環境 #stac2017
by
Yahoo!デベロッパーネットワーク
Jenkinsを用いたAndroidアプリビルド作業効率化
by
Kenichi Kambara
Sansan における Android アプリ自動テスト導入事例
by
Kenichi Tatsuhama
Javaユーザに贈るJenkins 25のTips
by
Masanori Satoh
20121019 jenkins勉強会lt資料
by
Hiroko Tamagawa
What's hot
PDF
テスト駆動開発の進化
by
Yukei Wachi
PPTX
第9回Jenkins勉強会 超簡単Pipeline講座
by
Hiroko Tamagawa
PDF
Jenkinsで始める継続的デリバリーと実践の道程
by
Masanori Satoh
PDF
Ciじゃない方のJenkins
by
Katsuhiro Miura
KEY
テスト初心者Androiderのためのソフトウェアテスト入門
by
Satoshi Watanabe
PPTX
SI-Toolkitでテスト自動化を実現する現場で遭遇したこと
by
yuichi_kuwahara
KEY
テスト駆動開発入門
by
Shuji Watanabe
PDF
ドリコムJenkins勉強会資料
by
Go Sueyoshi (a.k.a sue445)
PPTX
グリー アジャイル開発における品質保証と人材活用
by
Kaede Ichihara
PDF
Custom lintcheckをつくろう
by
Makoto Yamazaki
PPTX
Jenkinsを使った初めての継続的インテグレーション
by
dcubeio
ODP
Jenkins導入ライブ
by
Hiasyoshi Suehiro
PDF
ぼくのかんがえた iOSテスト戦略
by
Naoki Umehara
PDF
「GebとSpockではじめるシステムテスト自動化」
by
Hiroyuki Ohnaka
PDF
20151021 cookpad talk_test_engineer
by
Kazuaki Matsuo
KEY
Androidリリース作業の効率化(2)
by
Kenichi Kambara
PDF
Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会
by
Koji Hasegawa
PDF
はてなにおける Android アプリのソフトウェアテスト
by
Yu Nobuoka
PDF
Jjug ccc 2016_fall_blue_green_deployment
by
Hiroyuki Onaka
PDF
『はじめてのClojure』勉強会#3 第7章:テスト、テスト、テスト
by
makopi 23
テスト駆動開発の進化
by
Yukei Wachi
第9回Jenkins勉強会 超簡単Pipeline講座
by
Hiroko Tamagawa
Jenkinsで始める継続的デリバリーと実践の道程
by
Masanori Satoh
Ciじゃない方のJenkins
by
Katsuhiro Miura
テスト初心者Androiderのためのソフトウェアテスト入門
by
Satoshi Watanabe
SI-Toolkitでテスト自動化を実現する現場で遭遇したこと
by
yuichi_kuwahara
テスト駆動開発入門
by
Shuji Watanabe
ドリコムJenkins勉強会資料
by
Go Sueyoshi (a.k.a sue445)
グリー アジャイル開発における品質保証と人材活用
by
Kaede Ichihara
Custom lintcheckをつくろう
by
Makoto Yamazaki
Jenkinsを使った初めての継続的インテグレーション
by
dcubeio
Jenkins導入ライブ
by
Hiasyoshi Suehiro
ぼくのかんがえた iOSテスト戦略
by
Naoki Umehara
「GebとSpockではじめるシステムテスト自動化」
by
Hiroyuki Ohnaka
20151021 cookpad talk_test_engineer
by
Kazuaki Matsuo
Androidリリース作業の効率化(2)
by
Kenichi Kambara
Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会
by
Koji Hasegawa
はてなにおける Android アプリのソフトウェアテスト
by
Yu Nobuoka
Jjug ccc 2016_fall_blue_green_deployment
by
Hiroyuki Onaka
『はじめてのClojure』勉強会#3 第7章:テスト、テスト、テスト
by
makopi 23
Similar to Dependency injection
PDF
Spring3.1概要x di
by
Yuichi Hasegawa
PDF
AndroidでDIxAOP
by
nfc research
PDF
dependecy injection の話
by
chigichan24
PDF
[豆ナイト]Java small object programming
by
Yuichi Hasegawa
PPTX
C#の書き方
by
信之 岩永
PPTX
C#の書き方
by
信之 岩永
PDF
Javaセキュアコーディングセミナー東京第1回 講義
by
JPCERT Coordination Center
PPTX
IdrisでWebアプリを書く
by
Hideyuki Tanaka
PDF
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
by
Masahiro Sakai
PDF
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
by
TIS Inc.
PDF
JSクラス定義
by
Wataru Nakaseko
PPTX
C#メタプログラミング概略 in 2021
by
Atsushi Nakamura
KEY
関ジャバ JavaOne Tokyo 2012報告会
by
Koichi Sakata
PDF
ケーススタディ/実装 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第46回】
by
Tomoharu ASAMI
PDF
Dart / Flutter コードファイルジェネレート入門
by
cch-robo
PDF
アドテクに携わって培った アプリをハイパフォーマンスに保つ設計とコーディング
by
MicroAd, Inc.(Engineer)
PPTX
Eclipse modeling projectの概要
by
Shintaro Hosoai
PDF
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
by
Tomoharu ASAMI
PPTX
GoF デザインパターン 2009
by
miwarin
PDF
Play ja 3_update
by
Takafumi Ikeda
Spring3.1概要x di
by
Yuichi Hasegawa
AndroidでDIxAOP
by
nfc research
dependecy injection の話
by
chigichan24
[豆ナイト]Java small object programming
by
Yuichi Hasegawa
C#の書き方
by
信之 岩永
C#の書き方
by
信之 岩永
Javaセキュアコーディングセミナー東京第1回 講義
by
JPCERT Coordination Center
IdrisでWebアプリを書く
by
Hideyuki Tanaka
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
by
Masahiro Sakai
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
by
TIS Inc.
JSクラス定義
by
Wataru Nakaseko
C#メタプログラミング概略 in 2021
by
Atsushi Nakamura
関ジャバ JavaOne Tokyo 2012報告会
by
Koichi Sakata
ケーススタディ/実装 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第46回】
by
Tomoharu ASAMI
Dart / Flutter コードファイルジェネレート入門
by
cch-robo
アドテクに携わって培った アプリをハイパフォーマンスに保つ設計とコーディング
by
MicroAd, Inc.(Engineer)
Eclipse modeling projectの概要
by
Shintaro Hosoai
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
by
Tomoharu ASAMI
GoF デザインパターン 2009
by
miwarin
Play ja 3_update
by
Takafumi Ikeda
Dependency injection
1.
Dependency injection framework. Dagger2
2.
WHO? • 松村 勇輝 •
Twitter. @Yuki_312 • Yukiの枝折. http://yuki312.blogspot.jp/ • Android Developer
3.
CONTENTS • 依存性 • DI
Framework • Dagger2 • テストとアーキテクチャ • 補足
4.
ソフトウェア設計の課題
5.
依存性
6.
依存性
7.
依存性 GitHubの情報を“保存する”アプリケーション GitHub <interface> GitHubStore
8.
依存性 GitHubの情報を“保存する”アプリケーション GitHubStoreを使って“保存”を実現する GitHub <interface> GitHubStore
9.
依存性 implements インタフェースはそのままでは使えない. 具象化した実装クラスが必要. GitHubDatabase GitHub <interface> GitHubStore
10.
依存性 実装クラスはインスタンス化しなければならない. GitHubDatabase new GitHub <interface> GitHubStore
11.
依存性 実装クラスはインスタンス化しなければならない. class GitHub { private
GitHubStore store = new GitHubDatabase(); } GitHubDatabase new GitHub <interface> GitHubStore
12.
依存性 newが依存性を生む. GitHubの保存形式がDatabaseに固定されてしまう. GitHubDatabase new GitHub <interface> GitHubStore class GitHub { private
GitHubStore store = new GitHubDatabase(); }
13.
依存性 依存性はシステムの振る舞いを固定する. GitHubDatabase new GitHub <interface> GitHubStore class GitHub { private
GitHubStore store = new GitHubDatabase(); }
14.
依存性 依存性はシステムの振る舞いを固定する. 依存性はシステムの多様性を殺す. GitHubDatabase new GitHub <interface> GitHubStore class GitHub { private
GitHubStore store = new GitHubDatabase(); }
15.
依存性 依存性はテストの振る舞いを固定する. 依存性はテストの多様性を殺す. テストが辛い.
16.
DEPENDENCY INJECTION
17.
• 制御の反転 –
Inversion of Control • ハリウッドの原則 – Hollywood Principle 依存性の注入 GitHub GitHubDatabase new
18.
ハリウッドの原則「おまえが呼ぶな, おれが呼ぶ」 依存性の注入 GitHub GitHubDatabase new
19.
依存性の注入 GitHub GitHubDatabase Inject ハリウッドの原則「おまえが呼ぶな, おれが呼ぶ」 class
GitHub { public GitHub(GitHubStore store) {...} } new GitHub(new GitHubDatabase());
20.
依存性の注入 GitHub GitHubDatabase Inject ハリウッドの原則「おまえが呼ぶな, おれが呼ぶ」 class
GitHub { public GitHub(GitHubStore store) {...} } new GitHub(new GitHubDatabase());
21.
依存性の注入 ハリウッドの原則「おまえが呼ぶな, おれが呼ぶ」 GitHub GitHubStore GitHubDatabase Client new Inject class
GitHub { public GitHub(GitHubStore store) {...} } new GitHub(new GitHubDatabase());
22.
依存性の注入 GitHubの依存性を制御できるようになった. e.g. 商用ではDatabase, 検証用ではMemory
cacheに... 切り替えが容易になって, テストが楽になる!
23.
CREATION DESIGN
24.
new, new, new... 制御の反転だけでは生成コードが散在する
25.
new, new, new... 制御の反転だけでは生成コードが散在する ClientA: new
GitHub(new GitHubDatabase()); ClientB: setDatabase(new GitHubDatabase()); ClientC: create(new GitHubDatabase());
26.
new, new, new... e.g.
UnitTestではMemory cacheでテストしたい ClientA: new GitHub(new GitHubDatabase()); ClientB: setDatabase(new GitHubDatabase()); ClientC: create(new GitHubDatabase());
27.
new, new, new... e.g.
UnitTestではMemory cacheでテストしたい ClientA: new GitHub(new GitHubDatabase() new GitHubMemcached()); ClientB: setDatabase(new GitHubDatabase() new GitHubMemcached()); ClientC: create(new GitHubDatabase() new GitHubMemcached());
28.
new, new, new... クライアントも含めたテストが難しい... システム全体の依存性を変更するのが難儀... ClientA: new
GitHub(new GitHubDatabase() new GitHubMemcached()); ClientB: setDatabase(new GitHubDatabase() new GitHubMemcached()); ClientC: create(new GitHubDatabase() new GitHubMemcached());
29.
FACTORY PATTERN
30.
Factory Pattern GitHub GitHubStore GitHubDatabase Client Factory
Pattern適用前
31.
Factory Pattern GitHub GitHubStore GitHubDatabase Client new Factory
Pattern適用前
32.
Factory Pattern GitHub GitHubStore GitHubDatabase Client Inject GitHubDatabase Factory
Pattern適用前
33.
Factory Pattern GitHub GitHubStore GitHubDatabase Client Inject GitHubDatabase Factory
Pattern適用前 class GitHub { public GitHub(GitHubStore store) {...} } new GitHub(new GitHubDatabase());
34.
Factory Pattern Factory Pattern適用後 GitHub
GitHubStore GitHubDatabase Client
35.
Factory Pattern 生成処理をFactoryに委譲して問題領域を局所化 GitHub GitHubStore GitHubDatabase Client Factory
36.
Factory Pattern 生成処理をFactoryに委譲して問題領域を局所化 GitHub GitHubStore GitHubDatabase Client Factory Get
37.
Factory Pattern FactoryがGitHubDatabaseを生成する GitHub GitHubStore GitHubDatabase Client Factory new
38.
Factory Pattern FactoryがGitHubDatabaseを生成する GitHub GitHubStore GitHubDatabase Client Factory
39.
Factory Pattern Clientを実装の詳細から隠蔽する GitHub GitHubStore GitHubDatabase Client Factory Inject
40.
Factory Pattern Clientを実装の詳細から隠蔽する GitHub GitHubStore GitHubDatabase Client Factory new
GitHub(Factory.getGitHubStore(type, flag)); Inject
41.
FACTORYの問題
42.
Factoryの問題
43.
Factoryの問題 • 多くの生成処理を委譲されて肥大化する
44.
Factoryの問題 • 多くの生成処理を委譲されて肥大化する • 生成順序,
構築方法に責任を持つ責務過多
45.
Factoryの問題 • 多くの生成処理を委譲されて肥大化する • 生成順序,
構築方法に責任を持つ責務過多 • Shared Object? Singleton?
46.
Factoryの問題 • 多くの生成処理を委譲されて肥大化する • 生成順序,
構築方法に責任を持つ責務過多 • Shared Object? Singleton? • Lifecycle, Scopeの管理も必要
47.
Factoryの問題 依然, 散在するコピペコード
48.
Factoryの問題 依然, 散在するコピペコード Factory.getGitHubStore(type, flag); Factory.getGitHubStore(type,
flag); Factory.getGitHubStore(type, flag); Factory.getGitHubStore(type, flag); Factory.getGitHubStore(type, flag); Factory.getGitHubStore(type, flag); Factory.getGitHubStore(type, flag); Factory.getGitHubStore(type, flag); Factory.getGitHubStore(type, flag); Factory.getGitHubStore(type, flag); Factory.getGitHubStore(type, flag); Factory.getGitHubStore(type, flag); Factory.getGitHubStore(type, flag); Factory.getGitHubStore(type, flag);
49.
解決策
50.
DI FRAMEWORK
51.
DI Framework
52.
DI Framework • コピペコードの排除
53.
DI Framework • コピペコードの排除 •
依存オブジェクトの管理を委譲
54.
DI Framework • コピペコードの排除 •
依存オブジェクトの管理を委譲 GitHub GitHubStore GitHubDatabase Client Factory new Inject 依存オブジェクト
55.
DI Framework • コピペコードの排除 •
依存オブジェクトの管理を委譲 GitHub GitHubStore GitHubDatabase Client new DI FW. Inject 依存オブジェクト
56.
DAGGER2
57.
Dagger2 • for Java
& Android • Annotation Processingベースでデバッグが楽 • 高速 • コンパイル時に依存性の検証を行う • Googleがメンテナ
58.
Dagger2 DI Frameworkの3ステップ
59.
Dagger2 DI Frameworkの3ステップ 1. 依存性の要求 Dagger2 Request
Dependency GitHub
60.
Dagger2 DI Frameworkの3ステップ 1. 依存性の要求 2.
依存性の探索 Dagger2GitHub Lookup Dependency
61.
Dagger2 DI Frameworkの3ステップ 1. 依存性の要求 2.
依存性の探索 3. 依存性の充足 Dagger2 Inject Dependency GitHub
62.
依存性の要求
63.
依存性の要求 依存オブジェクトをどのように要求するのか? Request Dependency GitHub
64.
依存性の要求 依存オブジェクトは @Inject で要求する Dagger2 GitHub GitHubStore
65.
依存性の要求 依存オブジェクトは @Inject で要求する Dagger2 GitHub GitHubStore @Inject
GitHubStore store;
66.
依存性の要求 依存オブジェクトは @Inject で要求する Dagger2 GitHub GitHubStore Request
Dependency @Inject GitHubStore store;
67.
依存性の探索
68.
依存性の探索 依存性オブジェクトをどのように探索するのか? Dagger2 Lookup Dependency
69.
依存性の探索 Dagger2 GitHubDatabase
70.
依存性の探索 Dagger2 GitHubDatabase class GitHubDatabase { @Inject
GitHubDatabase() {...} }
71.
依存性の探索 Dagger2 GitHubDatabase lookup & new class
GitHubDatabase { @Inject GitHubDatabase() {...} }
72.
依存性の探索 Dagger2 GitHubDatabase GitHubDatabase
73.
依存性の充足
74.
依存性の充足 依存性をどのように充足するのか Dagger2 Inject Dependency GitHub
75.
Dagger2GitHub 依存性の充足 ソフトウェア全体の依存性を満たす GitHubStore GitHubDatabase
76.
Dagger2GitHub 依存性の充足 ソフトウェア全体の依存性を満たす GitHubStore GitHubDatabase DI
77.
Dagger2GitHub 依存性の充足 ソフトウェア全体の依存性を満たす GitHubDatabase GitHubDatabase
78.
Dagger2 依存性の充足 ソフトウェア全体の依存性を満たす GitHub GitHubWebApi GitHubDatabase GitHubDatabase
79.
依存性の充足 ソフトウェア全体の依存性を満たす Dagger2GitHub GitHubWebApi GitHubWebApi GitHubDatabase GitHubDatabase
80.
依存性の充足 ソフトウェア全体の依存性を満たす Dagger2GitHub GitHubWebApi DI GitHubDatabase GitHubWebApi GitHubDatabase
81.
依存性の充足 ソフトウェア全体の依存性を満たす Dagger2GitHub GitHubDatabase GitHubWebApi GitHubWebApi GitHubDatabase
82.
依存性の充足 ソフトウェア全体の依存性を満たす Dagger2RepositoryViewer GitHub GitHubDatabase GitHubWebApi GitHub GitHubWebApi GitHubDatabase
83.
依存性の充足 ソフトウェア全体の依存性を満たす Dagger2RepositoryViewer GitHub GitHubDatabase GitHubWebApi GitHub lookup & new GitHubWebApi GitHubDatabase
84.
依存性の充足 ソフトウェア全体の依存性を満たす Dagger2 GitHub RepositoryViewer GitHub GitHubWebApi GitHubDatabase
85.
依存性の充足 ソフトウェア全体の依存性を満たす Dagger2 DI RepositoryViewer GitHub GitHub GitHubWebApi GitHubDatabase
86.
依存性の充足 ソフトウェア全体の依存性を満たす Dagger2RepositoryViewer GitHub GitHub GitHubWebApi GitHubDatabase
87.
依存性の充足 ソフトウェア全体の依存性を満たす Dagger2RepositoryViewer GitHub GitHub lookup &
new GitHubWebApi GitHubDatabase
88.
依存性の充足 ソフトウェア全体の依存性を満たす Dagger2 RepositoryViewer GitHub GitHubWebApi GitHubDatabase
89.
依存性の充足 ソフトウェア全体の依存性を満たす Dagger2 GitHubDatabaseGitHubWebApi GitHub RepositoryViewer RepositoryViewer GitHub GitHubWebApi GitHubDatabase
90.
依存性の充足 Graph GitHubDatabaseGitHubWebApi GitHub RepositoryViewer
91.
続. 依存性の探索
92.
依存性の探索 コンストラクタへの@Injectでは解決できないケース
93.
依存性の探索 コンストラクタへの@Injectでは解決できないケース • インタフェースの解決(具体化) • 管理外クラスへの@Inject宣言 •
オブジェクトの構築を伴う生成
94.
PROVIDE DEPENDENCY
95.
依存性の提供 • Dagger2に閉じて解決できない 特殊な依存性を解決するFactory methodの提供
96.
依存性の提供 Instance Provider provideGitHubStore
97.
依存性の提供 @Provides Instance Provider provideGitHubStore
98.
依存性の提供 @Provides Instance Provider provideGitHubStore @Provides GitHubStore
provideGitHubStore() { return new GitHubDatabase(); }
99.
依存性の提供 Dagger2GitHub GitHubStore Instance Provider provideGitHubStore GitHubDatabase
100.
依存性の提供 Dagger2GitHub GitHubStore Instance Provider provideGitHubStore GitHubDatabase Request Dependency
101.
依存性の提供 Dagger2GitHub GitHubStore Instance Provider provideGitHubStore Resolved Dependency GitHubDatabase
102.
依存性の提供 Dagger2GitHub GitHubStore Instance Provider provideGitHubStore Call Factory
Method GitHubDatabase
103.
依存性の提供 Dagger2GitHub GitHubStore Instance Provider provideGitHubStore new GitHubDatabase
104.
依存性の提供 Dagger2GitHub GitHubStore Instance Provider provideGitHubStore GitHubDatabase GitHubDatabase
105.
依存性の提供 Dagger2GitHub GitHubStore DI GitHubDatabase Instance Provider provideGitHubStore GitHubDatabase
106.
依存性の提供 GitHub GitHubDatabase Dagger2 GitHubDatabase Instance Provider provideGitHubStore GitHubDatabase
107.
依存性の提供 @Provides Instance Provider provideGitHubStore @Provides GitHubStore
provideGitHubStore() { return new GitHubDatabase(); }
108.
依存性の提供 @Provides • インタフェースの解決(具体化) • 管理外クラスへの@Inject宣言 •
オブジェクトの構築を伴う生成 Instance Provider provideGitHubStore @Provides GitHubStore provideGitHubStore() { return new GitHubDatabase(); }
109.
依存性の提供 @Providesを持つクラスには @Module を付与する @Module class
ApplicationModule { @Provides GitHubStore provideGitHubStore() { return new GitHubDatabase(); } }
110.
GRAPH
111.
Graph Building the Graph Graphは
“Component” の単位で管理する GitHubDatabaseGitHubWebApi GitHub RepositoryViewer Dagger2 Component
112.
Building the Graph Graphの設計図として@Componentを宣言する @Component(modules=ApplicationModule.class) interface
ApplicationComponent {...}
113.
Building the Graph Graphの操作はComponentを通じて行われる Client
Component ApplicationComponent component = DaggerApplicationComponent.builder() .applicationModule(new ApplicationModule()) .build();
114.
俯瞰図
115.
@Inject memberField; @Module @Component / Dagger2 @Provide Interface /
Unmanaged Class Graph CREATE / BUILD PROVIDE FACTORY METHOD DEPENDENCY INJECTION @Inject Constructor() CREATE 依存オブジェクト 依存性の充足 依存性の要求
116.
TEST & ARCHITECTURE
117.
Test & Architecture DIが促進するもの •
レイヤーをきれいに分離できる • レイヤーが独立し, レイヤーの差し替えが容易 • テストが楽になる!
118.
Test & Architecture テスタビリティの向上 •
テストは検証用モジュールで実施 • テスト用レイヤに差し替え etc.
119.
DEMO
120.
Demo 商用…WebAPIの結果を表示&Databaseへ永続化 検証用…WebAPIの結果を表示&オンメモリキャッシュ シナリオ: 通常は商用環境で試験. ただし, AWS Device
Farmでは検証用で試験.
121.
Demo 商用モジュールで実施 Dagger2 GitHubDatabase GitHubWebApi GitHub RepositoryViewer GitHubStore
122.
Dagger2 Demo 商用モジュールで実施 DI GitHubWebApi GitHub RepositoryViewer GitHubStore GitHubDatabase
123.
Demo 商用モジュールで実施 GitHubWebApi GitHub RepositoryViewer GitHubDatabase Dagger2 GitHubDatabase
124.
Demo 検証用モジュールで実施 Dagger2 GitHubMemcache GitHubWebApi GitHub RepositoryViewer GitHubStore
125.
Demo 検証用モジュールで実施 Dagger2 GitHubMemcache DI GitHubWebApi GitHub RepositoryViewer GitHubStore
126.
Demo Dagger2 GitHubMemcache GitHubWebApi GitHub RepositoryViewer GitHubMemcache 検証用モジュールで実施
127.
Sample code GitHub -
Dagger2Sample https://github.com/YukiMatsumura/Dagger2Sample
128.
まとめ
129.
Dependency Injection • オブジェクトの生成は依存性を生む •
オブジェクトの生成はコスト/責務である • おまえが呼ぶな, おれが呼ぶ • DIがレイヤーの独立性を高める • DIがテスタビリティを高める
130.
以降, 補足
131.
Graphの操作 ComponentでGraphの操作を定義 • Graphが属するScopeの宣言 • 依存性注入のポイントを外部公開 •
他Componentへの依存
132.
Scope 依存オブジェクトのライフサイクルを指定 • Application単位のSingleton性を持たせる • Activity単位のSingleton性を持たせる
etc.
133.
Qualifier • 依存性の注入先に識別子を付ける • 同じ型の依存性解決に使用される
134.
Lazy Injection • オブジェクト取得時に依存性を解決・注入する •
遅延初期化
135.
Provider Injection • 依存性注入の都度newするnon-cached指定
136.
Subcomponent • ComponentAとComponentBに親子関係を持たせる • ComponentA+ComponentBのGraphをつくる
137.
dependencies • ComponentAとComponentBに使用関係を持たせる • ComponentA+ComponentBのGraphをつくる
138.
以上 ご清聴ありがとうございました
Download