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
Zenject Example SubContainer
Search
いも
September 23, 2019
Programming
14k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Zenject Example SubContainer
Unite Tokyo 2019 Eve2 LT Fes の資料です
いも
September 23, 2019
More Decks by いも
See All by いも
UnityプログラミングバイブルR6号宣伝&Unity Logging小話
adarapata
0
640
Unityテスト活動のふりかえり
adarapata
1
690
Gather.townはいいぞ その後
adarapata
1
1.7k
Unityでの開発事例
adarapata
3
23k
どこのご家庭にもあるシーンマネージャーの話
adarapata
2
8.8k
Gather.townはいいぞ
adarapata
2
2.4k
宴はいいぞ
adarapata
0
2.2k
わかった気になるモブプログラミング
adarapata
1
180
モブワークっぽいのをやっている話/Trying mobwork
adarapata
2
1.3k
Other Decks in Programming
See All in Programming
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
19k
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
720
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
390
初めての模倣学習とVLA
natsutan
0
250
「つくるAI」だけではバグは見つからない ~テストに必要な「見つけるAI」を分離させる戦略~
mfunaki
0
180
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
620
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
230
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
270
AIと壁打ちしながら進めるコスト管理
fufuhu
2
1.7k
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
2
210
typoなんかねぇよ
raspython3
0
550
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
730
Featured
See All Featured
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.5k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
480
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
420
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
580
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
360
Automating Front-end Workflow
addyosmani
1369
210k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
A designer walks into a library…
pauljervisheath
211
24k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
280
Transcript
Zenject Example ~Container の分割編~ @ いも 2019/09/23 Unite Tokyo 2019
Eve2 LT Fes
いも twitter: @adarapata ゲーム作ったりしてます 2019/09/23 Unite Tokyo 2019 Eve2 LT
Fes
宣伝 「Zenject チョットワカルBook 」を書きました ↓Booth 2019/09/23 Unite Tokyo 2019 Eve2
LT Fes
今日話すこと Installer 肥大化問題 Zenject のSubContainer について Zenject チョット触り始めてる人向け 2019/09/23 Unite
Tokyo 2019 Eve2 LT Fes
Installer 肥大化問題 public class SomeInstaller : MonoInstaller { public override
void InstallBindings() { // Player 関連のBind Container.Bind<Player>().AsCached(); Container.Bind<PlayerDependentA>().AsCached(); // Player しか依存してない Container.Bind<PlayerDependentB>().AsCached(); // Player しか依存してない ~~~ Container.Bind<PlayerDependentN>().AsCached(); // Player しか依存してない // Enemy 関連のBind Container.Bind<Enemy>().AsCached(); Container.Bind<EnemyDependentA>().AsCached(); // Enemy しか依存してない } } 2019/09/23 Unite Tokyo 2019 Eve2 LT Fes
Installer 肥大化問題 1 シーンに必要なものがそれなりに大きくなると起きる問題 あらゆる依存関係が1 シーンに刻まれる Scene のInsaller が細かい依存関係を知ることになる 不要な衝突も発生する可能性が出てくる
2019/09/23 Unite Tokyo 2019 Eve2 LT Fes
不要な衝突が発生する public class SomeInstaller : MonoInstaller { public override void
InstallBindings() { // Player 関連のBind Container.Bind<Player>().AsCached(); Container.Bind<PlayerDependentA>().AsCached(); // Player しか依存してない Container.Bind<Life>().AsCached(); // Player のLife を表現したい // Enemy 関連のBind Container.Bind<Enemy>().AsCached(); Container.Bind<EnemyDependentA>().AsCached(); // Enemy しか依存してない Container.Bind<Life>().AsCached(); // Enemy のLife を表現したい } } 2019/09/23 Unite Tokyo 2019 Eve2 LT Fes
不要な衝突が発生する 回避できないことはないがちょっと厳しい Container を分けてスマートにしたい 2019/09/23 Unite Tokyo 2019 Eve2 LT
Fes
やること SubContainer の利用 2019/09/23 Unite Tokyo 2019 Eve2 LT Fes
Container の階層関係 Container は階層関係を持つことができる まず自身のContainer を探して、解決できないなら親のContainer を 探す 親のContainer で見つからなかったらその親を~を繰り返す
ProjectContext がどこでもInject できるのは、このContainer の最上 位にいるから 2019/09/23 Unite Tokyo 2019 Eve2 LT Fes
Container の階層関係(Parent Contract の場合) Context を境界にContainer が繋がっている 2019/09/23 Unite Tokyo
2019 Eve2 LT Fes
1Context の内部だけでContainer の階層関係を作ることもできる 子にあたるContainer のことをSubContainer と呼ぶ 2019/09/23 Unite Tokyo 2019
Eve2 LT Fes
SubContainer にPlayer が必要とする要素をまとめてしまえば、 Container 内部で衝突しない 2019/09/23 Unite Tokyo 2019 Eve2
LT Fes
FromSubContainerResolve public class SomeInstaller : MonoInstaller { public override void
InstallBindings() { // SubContainer から解決する Container.Bind<Player>().FromSubContainerResolve() .ByMethod(InstallSubContainer); // Enemy 関連のBind } // SubContainer にInstall させる public void InstallSubContainer(DiContainer subContainer) { subContainer.Bind<Player>().AsCached(); subContainer.Bind<PlayerDependentA>().AsCached(); subContainer.Bind<Life>().AsCached(); } } 2019/09/23 Unite Tokyo 2019 Eve2 LT Fes
FromSubContainerResolve Bind するオブジェクトをSubContainer から探して解決する 今回だとSubContainer からPlayer を探して解決する このメソッドの後には「何でSubContainer を作るか」のBy~~ メソッ
ドを定義する ByMethod メソッドを呼んでInstall する ByInstaller Installer<T> なクラスを呼んでInstall する ほかにもいっぱいある 2019/09/23 Unite Tokyo 2019 Eve2 LT Fes
Installer で解決する場合 public class SomeInstaller : MonoInstaller { public override
void InstallBindings() { // SubContainer にInstaller でInstall して解決する Container.Bind<Player>().FromSubContainerResolve() .ByInstaller<PlayerInstaller>().AsCached(); // Enemy 関連のBind } } public class PlayerInstaller : Installer<PlayerInstaller> { public override void InstallBindings() { Container.Bind<Player>().AsCached(); Container.Bind<PlayerDependentA>().AsCached(); Container.Bind<Life>().AsCached(); } } 2019/09/23 Unite Tokyo 2019 Eve2 LT Fes
Player をSubContainer から引っ張って解決する Life PlayerDependentA はContainer からは見えない Container 単位で役割をグルーピングしやすい 2019/09/23
Unite Tokyo 2019 Eve2 LT Fes
GameObjectContext public class PlayerBehaviour : MonoBehaviour { [Inject] PlayerDependentA depA;
[Inject] Life life; } ↑ こういうのをSubContainer でBind したいとする SubContainer にMonoBehavior なオブジェクトをBind する場合、 GameObjectContext をアタッチする必要がある 2019/09/23 Unite Tokyo 2019 Eve2 LT Fes
GameObjectContext SceneContext ProjectContext と同じContext の一種 Context はInstall を行うエントリポイント それぞれInjection のスコープが違う
ProjectContext: ゲーム全体 SceneContext: シーン内 GameObjectContext: アタッチされたGameObject 以下 SceneContext のContainer にBind するとシーン全体にInject されるの で、GameObjectContext をSubContainer として狭い範囲へのInject を 行える 2019/09/23 Unite Tokyo 2019 Eve2 LT Fes
MonoBehavior でない場合 public class SomeInstaller : MonoInstaller { public override
void InstallBindings() { // SubContainer にInstaller でInstall して解決する Container.Bind<Player>().FromSubContainerResolve() .ByInstaller<PlayerInstaller>().AsCached(); } } public class PlayerInstaller : Installer<PlayerInstaller> { public override void InstallBindings() { Container.Bind<Player>().AsCached(); Container.Bind<PlayerDependentA>().AsCached(); Container.Bind<Life>().AsCached(); } } SubContainer の作り方が、直接Installer を指定する形になる 2019/09/23 Unite Tokyo 2019 Eve2 LT Fes
MonoBehaviour の場合 いつものSceneContext のノリで対象のPrefab にアタッチする 2019/09/23 Unite Tokyo 2019 Eve2
LT Fes
MonoBehaviour の場合 public class SomeInstaller : MonoInstaller { [SerializeField] private
GameObject _playerPrefab; public override void InstallBindings() { // GameObjectContext のついたPrefab を生成してInstall する Container.Bind<PlayerBehaviour>().FromSubContainerResolve() .ByNewContextPrefab(_playerPrefab).AsCached(); } } public class SubInstaller : MonoInstaller { public override void InstallBindings() { // Zenject Binding をアタッチするのもアリ Container.Bind<PlayerBehavior>().FromComponentOnRoot(); Container.Bind<PlayerDependentA>().AsCached(); Container.Bind<Life>().AsCached(); } } 2019/09/23 Unite Tokyo 2019 Eve2 LT Fes
Context を跨いで同じことが行われる 2019/09/23 Unite Tokyo 2019 Eve2 LT Fes
まとめ 1 つのContainer にどんどんBind していくと衝突や可読性の問題が現 れる SubContaienr に分離してスコープを狭めよう MonoBehaviour の場合はGameObjectContext
を使おう MonoBehaviour でもPureClass でもSubContainer の考え方は変わら ない。 Context があるかどうかだけ 2019/09/23 Unite Tokyo 2019 Eve2 LT Fes
おわり 2019/09/23 Unite Tokyo 2019 Eve2 LT Fes