VContainerのLifetimeScope継承クラスをrenameする時の注意点
UnityのVContainerで、LifetimeScope継承クラスをrenameしたら、VContainerExceptionが発生していたので、その際に試した内容を記録しておきます。
結論から言うと、 LifetimeScopeのParentの参照は、GUIDではなく文字列で保存されている という、VContainerの内部仕様が原因でした。
それでは見ていきます。
rename
こちらの記事に記載した方法でZenjectからVContainerへの移行をしたため、LifetimeScopeのnamingがInstallerのままになっており、Visual Studio側からrenameを行いました。
VContainerException

Presenter側で、Modelがresolveできていません。
renameしたことで、このPresenterのScope内で当該Modelが適切にRegisterされなくなったようです。
LifetimeScopeのPrefabを編集

Hierarchy上で確認すると、ParentがNoneになっていたので、本来意図しているSceneLifetimeScopeに設定しなおします。

Diffを見ると、 Parentの参照がGUIDではなく、文字列で保存されている ことがわかります。
正規表現で一括処理

今回は、 .*Installer という名前を .*LifetimeScope にrenameしていたため、 Assets ディレクトリ以下の全ファイルに対して、正規表現で一括検索と置換をします。
- (TypeName: .*)Installer
+ $1LifetimeScope
以上です。
IDEでのrename時、GUIDで参照を持っているものは基本的には壊れませんが、今回のようにComponent内などへ参照を文字列で持っているケースでは壊れることがあります。
とはいえ、Prefabなどのデータは実質YAMLファイルなので、正規表現で一括置換すれば大体何とかなります。
困ったときはPrefab差分の生データをにらみつけて、ゴリ押しで解決しましょう。
Discussion