📦

VContainerのLifetimeScope継承クラスをrenameする時の注意点

に公開

UnityのVContainerで、LifetimeScope継承クラスをrenameしたら、VContainerExceptionが発生していたので、その際に試した内容を記録しておきます。
結論から言うと、 LifetimeScopeのParentの参照は、GUIDではなく文字列で保存されている という、VContainerの内部仕様が原因でした。
それでは見ていきます。


rename

https://zenn.dev/sion_pn/articles/5a722d369e0021
こちらの記事に記載した方法で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