【Unity】 【VContainer】MonoBehaviour を登録したときのVContainerException: No such registration of type: XXXXXX

早くて軽いDI libraryの VContainer、とても使いやすいので最近のお気に入りです。

MonoBehaviourのComponentを登録するとエラーになることがある

builder.RegisterComponentInHierarchy<FooComponent>().AsImplementedInterfaces();

このようにRegisterComponentInHierarchyを使ってInterfaceを登録しようとすると、 VContainerException: No such registration of type: FooComponentとエラーが出てしまいます。
これを、

builder.RegisterComponentInHierarchy<FooComponent>().AsSelf().AsImplementedInterfaces();

このようにAsSelf()を追加することで登録できるようになります。
この問題のIssueは立っていたのですが、立てた方がこの解決方法だけ書いてcloseしていたのでバグというわけではない……? 多分。

それから別記事に書くほどでもないメモをもう一つ。
コンストラクタの引数に IEnumeratble<T> を指定して、ParentのLifetimeScopeにあるTを探してもらおうとしても、実際には自分自身のLifetimeScopeにないと空の IEnumerableが代入されてしまいます。親やその上のLifetimeScopeを探してほしいときはコンストラクタの引数をTにした方が良さそうです。

参考

https://githubmemory.com/repo/hadashiA/VContainer/issues/278

Leave a Reply