问题标签 [zenject]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
384 浏览

unity3d - 以程序方式在 ScriptableObjectInstaller 的多个实例之间交换

文档说您可以轻松地在多个 ScriptableObjectInstaller 之间进行交换。而且我认为您可以通过在 SceneContext 中分配所需的同一类的 ScriptableObjectInstaller 来做到这一点。但是如果我想在程序上决定使用哪个设置实例呢?在将设置注入到我需要的位置之前,我是否需要以某种方式在场景上下文中更改对我的 SettingsInstaller 的引用?如果是这样,我该怎么做?

例如,我有 2 个相同的 SettingsInstaller 实例:SettingsEasy 和 SettingsHard。在注入之前如何以编程方式在它们之间切换?如果我在场景上下文中有 2 个该设置的实例,那么它会给我一个这样的错误:

ZenjectException:在构建类型为“ClassWhereIInjectingIt”的对象时,当只有一个类型为“MySettingsType”时,发现了多个匹配项。

0 投票
1 回答
1926 浏览

unity3d - 运行时重新绑定和重新注入实例

我的问题是:我可以重新绑定一个实例并在我用 [Inject] 属性注入它的任何地方重新注入它。实例绑定如下:

然后,当 inst 发生变化时,我尝试这样做:

但它不起作用,并且像[Inject] private MyClass inst;以前一样注入的 MyClass 类型的每个字段都和以前一样。Mb 我只是误解了这个概念。有可能吗?

0 投票
1 回答
658 浏览

unity3d - Zenject Unity 测试场景 - 如何导航下一个场景,将容器正确更新到新的 SceneContext?

如何在场景测试期间在扩展 SceneTestFixture 的类中切换场景?

我需要在扩展 SceneTestFixture 时制作一个测试用例,在测试期间我加载场景“A”并将条件设置为 ProjectContext,然后在同一个测试中切换到场景“B”并让它测试条件是否已设置按'A',如果不返回'A'。

如果我按照 Zenject 文档尝试 LoadScene(),那么我不能重用它来切换到下一个场景。加载添加剂不是我需要的,所以不要使用LoadScenes(),如果我使用LoadScene()加载'A',然后通过标准Unity SceneManager切换到另一个场景,那么SceneContainer不会更新到新场景而且我不知道如何更新它。这是我的代码如何失败和流程的示例:

我在这里找到了 SceneTestFixture的来源,但我不知道如何将 Container 重新加载到新的 SceneContext?

0 投票
0 回答
542 浏览

unity3d - Zenject Unity3D测试场景命中“无法解析类”如何摆脱?

我有场景A(A)和场景B(B)。B 还具有由 SceneContext 安装程序安装的 Foo AsSingle 和 NonLazy。Foo 对 Debog.Log("Hello Errors!") 实施了 IIinitialize:

而且我听到“无法解析类”,而在调试中我看到了 Foo 的 hello 消息,所以安装程序已经完成了它的工作。现在,如果 Foo 是 MonoBehaviour,在一个游戏对象上,Zeneject 将其绑定为“来自场景”的组件,那么它将毫无问题地得到解决。在这种情况下,请让我知道如何解决。

**-- 编辑 -- 1 **

Foo 重命名为“BClass”。A 的安装程序为空。B的代码:

最后是测试:

-- 编辑 2 --

新变化:

结果将是这样的:

0 投票
1 回答
523 浏览

c# - Zenject 中方法绑定的多次调用

我有一个使用方法注入的 MonoBehaviour:

由于某种原因,此方法被 Zenject 调用了两次,我不明白为什么。更糟糕的是:如果我在类中添加一个 Update 方法,它不会做任何特别的事情(并且不会调用 Init!)突然 Init 会被调用 7 次!更新没有做任何花哨的事情:

两者之间的唯一联系是它们都调用 StartService,这又没有做任何特别的事情,只是在注入的字段之一上调用方法。

有人可以告诉我这里可能发生了什么吗?我正在使用 ProjectContext。我检查了其他一些看起来不错的课程。该类仅添加到场景中的一个游戏对象。

0 投票
1 回答
1144 浏览

unity3d - Zenject 如何设置当请求接口时,它会设置一个新的游戏对象,并返回一个新绑定的类实例

Zenject 很棒,但我还没有找到合适的解决方案来实例化游戏对象

我有一个脚本,它为单一行为事件提供各种事件挂钩。Start、PostStart、Update、FixedUpdate 等,因此非 Unity 控制器可以在某些事件中执行。它基于我命名为“IEventsController”的接口

我之前的设置是这样的:

我试图弄清楚 Zenject 是否有内置的解决方案。我可以使用工厂或方法,但是当 Zenject 可能已经处理它时,工厂有一个额外的类来管理它。使用一种方法来生成它仍然需要静态引用来检查它是否被创建,并且将它放在安装程序脚本中感觉不对。此外,还有 FromComponent 系列的绑定可能对此有所帮助,但到目前为止我还没有看到任何内容。

我可能期望的示例绑定方法调用:

  • 谢谢。
0 投票
1 回答
764 浏览

zenject - 是否可以注入一个没有与之关联的预制件/游戏对象的组件?

我有一个存在于场景中的游戏对象(比如说一个立方体),我希望它有一个可注入的组件。例如,我想说:我的多维数据集有一个 IShotFirer 成员,它可以解析为 BoomShotFirer 或 BangShotFirer MonoBehavior 组件,两者都实现了 IShotFirer。发生绑定时,我希望将此组件添加到多维数据集对象中。

是否可以在没有 1) 需要包含这些 Bang/Boom 组件之一的现有预制件或 2) 需要附加了这些组件之一的现有场景对象的情况下做到这一点?

换句话说,我希望能够根据绑定动态地将组件添加到我的游戏对象中,并且不依赖于定义 BoomShotFirer 或 BangShotFirer 的脚本文件以外的任何内容。但是文档似乎暗示我需要找到一个现有的游戏对象或预制件(例如使用.FromComponentsInChildren()等)

0 投票
0 回答
138 浏览

zenject - 如何在 Unity 内外使用 zenject,但使用不同的 DiContainer?

我正在为视频游戏开发一个平台,它是纯 c# 代码,我想使用 Zenject 进行依赖注入。这个想法是这个平台可以初始化它的依赖注入,而不管它在哪里使用。我在平台上有这个类:

它创建并初始化平台中使用的容器,但要在平台外使用它,我总是必须调用:

这是实现我想要的想法的正确方法吗?这种获得平台类的方法是否最佳(就性能而言)?您的任何想法或建议将不胜感激,问候。

0 投票
0 回答
704 浏览

unity3d - 我的 DI 有什么问题?- 依赖注入,Unity - 仅在注入后进行空引用

我是依赖注入的新手,我已经做了几天的研究,但似乎找不到答案;没有很多特定于 zenject 的示例,因此我一直在研究特定的 zenject 解决方案以及一般的 DI。

使用 Unity 2018.3f 和 Zenject 7.3.1。

我正在使用接口 IModifiableService 来构造函数将我的 ModifiableService 类注入到我的 ModifiableField 类中以填充它的依赖项。

在构造函数的控制台登录期间,它按预期注销“ModifiableService”。当在从 ModifiableField 脚本调用以触发 Calculate() 的单独方法中再次使用时,控制台日志为空。我似乎遗漏了一些东西或做错了,所以我非常感谢任何资源或建议,以便更好地理解 DI 以及如何解决我的问题。谢谢!

捆绑:

尝试将其更改为在安装程序中以不同的方式执行相同的操作;实现了相同的结果,让我认为我的安装程序是问题所在,并且在上述任何一次尝试中都没有正确绑定。

0 投票
2 回答
1086 浏览

unity3d - 在某些情况下,场景测试中未调用 Zenject Mono 安装程序

我有一个softozor由玩家控制的游戏对象组成的“主要”场景。这是一只飞扬的恐龙。作为该softozor游戏对象的子对象,我设置了另一个游戏对象 ,Installer它由一个 Transform 组件和一个PlayerInstaller (Script)组件组成:

图片

PlayerInstaller安装了我的播放器逻辑所需的一切。最后,在softozor游戏对象中,我添加了一个Game Object Context (Script)我注册的位置PlayerInstaller

图片

除了softozor游戏对象,我还定义了一个SceneContext

图片

您会注意到所有安装程序列表都是空的SceneContext。但是,如果没有任何SceneContext注册,PlayerInstaller 则不会触发。使用该设置玩游戏效果很好,即被PlayerInstaller调用,我可以控制我的恐龙在我的游戏中做任何我想做的事情。

到现在为止还挺好。现在,考虑以下场景测试:

在该测试中,_player成员变量没有注入满足IPlayer合同的对象。事实上,PlayerInstaller.InstallBindings()不叫。

相反,如果我摆脱我的游戏对象中的Game Object Context (Script)组件,并在以下位置注册:softozorPlayerInstallerSceneContext

图片

然后我也可以像以前一样玩游戏,并且我的测试正在运行,即PlayerInstaller.InstallBindings()在我的场景测试期间调用该方法。

PlayerInstaller我在softozor游戏对象上下文中注册的第一次尝试有什么问题?

我正在与

  • Zenject 版本。7.3.1
  • Unity 2019.1.8f1 PC、Mac 和 Linux 独立版