1

我正在尝试学习如何使用 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 来实现这一点的解决方案?

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

4

1 回答 1

0

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

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

  • 可能有多个感兴趣的接收器在监听信号
  • 发送者不需要从接收者那里得到结果
  • 发件人甚至不在乎是否收到。换句话说,发送者不应依赖于调用信号时的某些状态更改,以使后续发送者逻辑正常工作。理想情况下,信号可以被认为是“即发即弃”事件
  • 发送者不经常或在不可预测的时间触发信号

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

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

于 2022-01-07T21:38:38.320 回答