SlideShare a Scribd company logo
Dagger2 の
@SubComponent と dependencies について
Tsuyoshi Yoshioka (@tsuyogoro)
Mercari Android Engineer
About me
Tsuyoshi Yoshioka (@tsuyogoro)
Android engineer
Mercari, Inc
Mercari in US
About this talk
@SubComponent
vs
dependencies = { .... }
Dagger2
Component
Module (A)
@Provide XData provideX() { … }
Module (B)
@Provide YData provideY() { … }
Module (C)
@Provide ZData provideZ() { … }
@Inject XData x;
@Inject YData y;
@Inject ZData z;
…
void init() {
…
Component.get().inject(this);
}
@SubComponent
App
Component
EventRegister
Component
@Component (modules = { … } )
interface AppComponent {
EventRegisterComponent subComponent();
....
}
@SubComponent (modules = { … })
interface EventRegisterComponent {
...
}
appComponent.subComponent()
● AppComponent が provide するインスタンスも provideできる ⇛ クラス継承に似ている
● SubSubComponent は無いので、これ以上の親子関係が作れない
dependencies
App
Component
EventRegister
Component
@Component (modules = { … } )
interface AppComponent {
...
}
@Component (
modules = { … }
dependencies = AppComponent.class
)
interface EventRegisterComponent {
...
}
DaggerEventRegisterComponent
.builder()
.appComponent(appComponent)
.build();
● @SubComponent 同様 AppComponent の provide 機能を継承 (?) できる
● dependencies には複数 component を指定することが可能
● ただし、SubSubComponent のような階層構造になる時は書き方に注意 (appendix にて)
@SubComponent vs dependencies
@SubComponent dependencies
依存グラフの階層 親 & 子 まで 親子以上作れる
使いやすさ 割と最初はとっつきやすかった印象。
色々理解してから dagger2 を使い出す
と、”親子まで” という制約が辛くなる時が
ある
component の取り扱いを理解するまで
はなかなかキツかった。
親子以上の依存グラフが作れるのはと
ても大きい。データのライフサイクルを
きちんと考えて設計する場合はこちらを
オススメ。
More practice... http://qiita.com/tsuyoyo/items/d48553cdc4189ade17bc
Let’s make world better place together!!
(Android) http://bit.ly/2wGK8r2 (iOS) http://bit.ly/2wsUzPK
dependencies
App
Component
EventRegister
Component
@Component (modules = { … } )
interface AppComponent {
…
@Provide AppData appData() { … }
}
@Component (
modules = { … }
dependencies = AppComponent.class
)
interface EventRegisterComponent {
…
AppData appData();
}
SubEventRegister
Component
@Component (
modules = { … }
dependencies = EventRegisterComponent.class
)
interface SubEventRegisterComponent {
...
}
provide の継承は一つ下までしかでき
ないので、それ以上を継承したい場合
は、親側で宣言が必要。
この場合は、
EventRegisterComponent に
AppData を provide する旨を記載し
ないと、
SubEventRegisterComponent で
AppData が inject できない

More Related Content

Similar to Tips of dagger2 (@SubComponent vs dependencies)

改めまして、Cognitive ToolKit です。
 改めまして、Cognitive ToolKit です。 改めまして、Cognitive ToolKit です。
改めまして、Cognitive ToolKit です。
Ryuichi Tokugami
 
楽しいアプリ制作の会 #12 Windows Phone 開発
楽しいアプリ制作の会 #12 Windows Phone 開発楽しいアプリ制作の会 #12 Windows Phone 開発
楽しいアプリ制作の会 #12 Windows Phone 開発Tomonori Ohba
 
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~Entity Compon...
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~Entity Compon...【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~Entity Compon...
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~Entity Compon...
Unity Technologies Japan K.K.
 
Using the Fragments(Android)
Using the Fragments(Android)Using the Fragments(Android)
Using the Fragments(Android)
Teruaki Kinoshita
 
おいしいFragment #antama_ws
おいしいFragment #antama_wsおいしいFragment #antama_ws
おいしいFragment #antama_wsTakahiro Yoshimura
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Yoshifumi Kawai
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11えぴ 福田
 
Tech talk salesforce mobile sdk
Tech talk   salesforce mobile sdkTech talk   salesforce mobile sdk
Tech talk salesforce mobile sdkKazuki Nakajima
 
Fujitask meets Extensible Effects
Fujitask meets Extensible EffectsFujitask meets Extensible Effects
Fujitask meets Extensible Effects
Hikaru Yoshimura
 
Flutter のリアクティブ戦略 set state 〜 redux まで
Flutter のリアクティブ戦略 set state 〜 redux までFlutter のリアクティブ戦略 set state 〜 redux まで
Flutter のリアクティブ戦略 set state 〜 redux まで
cch-robo
 

Similar to Tips of dagger2 (@SubComponent vs dependencies) (10)

改めまして、Cognitive ToolKit です。
 改めまして、Cognitive ToolKit です。 改めまして、Cognitive ToolKit です。
改めまして、Cognitive ToolKit です。
 
楽しいアプリ制作の会 #12 Windows Phone 開発
楽しいアプリ制作の会 #12 Windows Phone 開発楽しいアプリ制作の会 #12 Windows Phone 開発
楽しいアプリ制作の会 #12 Windows Phone 開発
 
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~Entity Compon...
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~Entity Compon...【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~Entity Compon...
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~Entity Compon...
 
Using the Fragments(Android)
Using the Fragments(Android)Using the Fragments(Android)
Using the Fragments(Android)
 
おいしいFragment #antama_ws
おいしいFragment #antama_wsおいしいFragment #antama_ws
おいしいFragment #antama_ws
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
 
Tech talk salesforce mobile sdk
Tech talk   salesforce mobile sdkTech talk   salesforce mobile sdk
Tech talk salesforce mobile sdk
 
Fujitask meets Extensible Effects
Fujitask meets Extensible EffectsFujitask meets Extensible Effects
Fujitask meets Extensible Effects
 
Flutter のリアクティブ戦略 set state 〜 redux まで
Flutter のリアクティブ戦略 set state 〜 redux までFlutter のリアクティブ戦略 set state 〜 redux まで
Flutter のリアクティブ戦略 set state 〜 redux まで
 

Tips of dagger2 (@SubComponent vs dependencies)

  • 1. Dagger2 の @SubComponent と dependencies について Tsuyoshi Yoshioka (@tsuyogoro) Mercari Android Engineer
  • 2. About me Tsuyoshi Yoshioka (@tsuyogoro) Android engineer Mercari, Inc
  • 4.
  • 6. Dagger2 Component Module (A) @Provide XData provideX() { … } Module (B) @Provide YData provideY() { … } Module (C) @Provide ZData provideZ() { … } @Inject XData x; @Inject YData y; @Inject ZData z; … void init() { … Component.get().inject(this); }
  • 7. @SubComponent App Component EventRegister Component @Component (modules = { … } ) interface AppComponent { EventRegisterComponent subComponent(); .... } @SubComponent (modules = { … }) interface EventRegisterComponent { ... } appComponent.subComponent() ● AppComponent が provide するインスタンスも provideできる ⇛ クラス継承に似ている ● SubSubComponent は無いので、これ以上の親子関係が作れない
  • 8. dependencies App Component EventRegister Component @Component (modules = { … } ) interface AppComponent { ... } @Component ( modules = { … } dependencies = AppComponent.class ) interface EventRegisterComponent { ... } DaggerEventRegisterComponent .builder() .appComponent(appComponent) .build(); ● @SubComponent 同様 AppComponent の provide 機能を継承 (?) できる ● dependencies には複数 component を指定することが可能 ● ただし、SubSubComponent のような階層構造になる時は書き方に注意 (appendix にて)
  • 9. @SubComponent vs dependencies @SubComponent dependencies 依存グラフの階層 親 & 子 まで 親子以上作れる 使いやすさ 割と最初はとっつきやすかった印象。 色々理解してから dagger2 を使い出す と、”親子まで” という制約が辛くなる時が ある component の取り扱いを理解するまで はなかなかキツかった。 親子以上の依存グラフが作れるのはと ても大きい。データのライフサイクルを きちんと考えて設計する場合はこちらを オススメ。
  • 11. Let’s make world better place together!! (Android) http://bit.ly/2wGK8r2 (iOS) http://bit.ly/2wsUzPK
  • 12.
  • 13. dependencies App Component EventRegister Component @Component (modules = { … } ) interface AppComponent { … @Provide AppData appData() { … } } @Component ( modules = { … } dependencies = AppComponent.class ) interface EventRegisterComponent { … AppData appData(); } SubEventRegister Component @Component ( modules = { … } dependencies = EventRegisterComponent.class ) interface SubEventRegisterComponent { ... } provide の継承は一つ下までしかでき ないので、それ以上を継承したい場合 は、親側で宣言が必要。 この場合は、 EventRegisterComponent に AppData を provide する旨を記載し ないと、 SubEventRegisterComponent で AppData が inject できない