VContainer
ゲーム中のクラスの依存関係の解決を簡単にするために使われる
LifetimeScope
IConteinerBuilderの生成とBuildeへのクラス登録を行い、IObjectResolveを生成
Mono Behaviourを継承しているのでgamebojectにアタッチ可能
Configure(IContainerBuilder builder)で登録のコードを記述
既存のgameobjectを登録&DIで注入可能
Serializablefiledを使いインスペクタ経由でLiftimeScopeにDIすれば良い
MonobehaviorへのInject
コンストラクタとなるべきメソッドに[Inject]属性をつけておく
vconteierを[Inject]属性を目印に登録済みインスタンスを挿入する
コンストラクタではなく[Inject]を目印にするのはNewできないMonobehaviorクラスへの対応
MonobehaviorへのInject推奨しない理由
Monobehaviorのインスタンスはunity側の都合でいつ消えたり増えたりするかわからないから
参照管理が複雑になる
Prefabとかの場合はポータビリティが消える
実行時に動的に変化するものはInjectで依存解決するのではなく、引数の値として引き渡した方がいい。
MVPで使うケースだとPrestenrとModelはpure c#クラスで実装
Presetner側にMonobehavior(view)とModelをInjectするケースが多そう
EntryPoint
通常のpure c# クラスでMonobehaviorのようなlifetime cycleを提供
LifeTime
DIで生成するときのインスタンスを使い回すか否か
Lifetime.Singoleton
同じクラスでインスタスを使い回す
Lifetime.Transient
インスタンスを使いまわさず別個に生成
Lifetime.Scoped
builder Regiter
Register<>()
prure c# class, interfaceを登録
RegisterComponent()
引数のMonobehabirour インスタンスを登録g
RegisterFactory<>()
引数のクラスを返すファクトリメソッドを登録
動的に変わるクラスのインスタンスの依存解決をしたい場合に使える
RegisterInstance()
ゲームオブジェクトを登録
既存ゲームオブジェクトを渡したいときに
RegisterComponentInHierarchy<>()
引数のクラスの既存インスタンスをシーンヒルエラキーから探索して登録
.UnderTransform(transform)を使うと探索範囲をtransform以下に制限できる。
RegisterComponentInNewPrefab<>()
引数のPrefabからinstantinateしたインスタンスのクラスを登録
RegisterEntryPoint<>()
IContainerBuilderの生成直後に指定したクラスがインスタンス化される。
シーンのEntryPointとかで使うと良い
渡すクラス側で最低一つの何かしらのInterface(IInitializable等)を実装しておくこと
RegisterMessagePipe()
すべてインスタンスの注入