【问题标题】:Unity & Zenject - How to execute methods in sequence order from a TSignal.Fire()Unity & Zenject - 如何从 TSignal.Fire() 中按顺序执行方法
【发布时间】:2022-01-07 16:40:19
【问题描述】:

我正在尝试学习如何使用 Zenject 和 unity,我遇到了一个特定问题,我不知道它是否有可能仅使用 Zenject 的 api 的解决方案。

假设我有 MethodA、MethodB 和 MethodC,以及一个 SignalA。

是否可以做这个序列:

SignalA.Fire() => MethodA (until released/finished)

               => MethodB (until released/finished)

               => MethodC (until released/finished)

现在我有这段代码:

private void BindSignalA()
{

    Container.DeclareSignal<SignalA>().RunSync();
                    
    Container.BindSignal<SignalA>().ToMethod<MethodA>(handler => handler.Execute).FromNew();
    Container.BindSignal<SignalA>().ToMethod<MethodB>(handler => handler.Execute).FromNew();
    Container.BindSignal<SignalA>().ToMethod<MethodC>(handler => handler.Execute).FromNew();
}

MethodA 看起来像这样:

public class MethodA
{     
    public async void Execute()
    {
        await new WaitUntil(() => false);
    }
}

所以预期的结果是 MethodB 和 MethodC 永远不会被执行。

但实际结果是所有Methods都被执行了。

有没有使用 Zenject 的 api 的解决方案来实现这一点?

感谢您的帮助,如果需要更多信息,我很想知道。

【问题讨论】:

    标签: c# unity3d dependency-injection game-engine zenject


    【解决方案1】:

    我不熟悉信号,但检查 documentation ,主要考虑第三点,也许你的情况不是信号使用的好场景。

    何时使用信号 在以下情况下,信号最适合作为一种通信机制:

    • 可能有多个感兴趣的接收器在监听信号
    • 发送方不需要从接收方返回结果
    • 发件人甚至不在乎是否收到。换句话说,当调用信号时,发送者不应该依赖于某些状态变化,以便后续发送者逻辑正常工作。理想情况下,信号可以被认为是“一发不可收拾”的事件
    • 发送方很少或在不可预测的时间触发信号

    另一方面,我可能会混淆将代码与同步执行概念解耦。委托或事件(这是一种特定类型的委托)是一个类的备用逻辑,您可以保留这些逻辑,以便可以在其他类中执行,以便您可以“订阅”或“收听”可能发生的事情在代码的其他部分执行/调用您的事件。但是,这不涉及任何异步代码或多线程。

    据我猜测,信号用于以与 Zenject 信号对象解耦的方式处理事件订阅/调用,类似于以与接口解耦的方式处理类之间的依赖关系,所以首先我会检查您的案例是否适合他们使用,仔细检查文档并遵循提供的示例,直到概念点击。
    同时,我会先尝试使用 c# normal delegates,以便在 zenject signal mison 之后可以理解。还提供一个简单的工作示例,说明您在没有 zenject 的情况下尝试做什么,这将非常有助于作为出发点,以实现实现相同目标的 zenject 方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      相关资源
      最近更新 更多