【问题标题】:How to use Caliburn Micro's EventAggregator to send empty events (no payload)?如何使用 Caliburn Micro 的 EventAggregator 发送空事件(无负载)?
【发布时间】:2017-04-06 22:54:18
【问题描述】:

我发现 articles about 和 solutions 是关于这个与 Prism 相关的问题,但我没有找到任何与 Caliburn Micro 相关的信息。我检查了 所有 标记为 Caliburn.MicroEventAggregator 的问题,但没有找到任何关于这个看似基本问题的 Caliburn 特定内容。

场景:我想向EventAggregator 发布没有任何信息的事件,除了发出发生某事的信号。

问题:首先,在 Caliburn Micro 中,EventAggregatorPublish() 方法需要发送一个类型的实例。其次,订阅和处理事件需要实现IHandle<T>接口,其中T是我们想要接收的实例类型。似乎这是完全围绕发布和处理实际数据而设计的。

目标:能够发布简单的事件,而不必创建和实例化多个空/虚拟类,也不必Handle() 我需要使用条件进一步过滤的不必要事件。


到目前为止我的解决方案

这是我想要改进/替换的。 (显然,这个解决方案是有问题的,因为它围绕具体类创建了更紧密的耦合,但在我的用例中,这不是一个大问题,因为它是一个小项目,具有针对给定事件的单一发布组件,而 EventAggregator 服务于其他实际目标.)

我创建了一个通用的Signal<T> 类,它实现了单例模式,通过Instance 属性提供了自身的静态实例:

public class Signal<T>
{
    public static readonly Signal<T> Instance = new Signal<T>();

    private Signal() { }
}

所以我可以通过以下方式发布事件(SignalSourceClass 是一个例子):

_eventAggregator.PublishOnUIThread(Signal<SignalSourceClass>.Instance);

并通过以下方式声明IHandle&lt;T&gt;的实现来处理事件:

IHandle<Signal<SignalSourceClass>>

这样我可以通过只创建一个Signal 类来发送和接收“空”事件。 (当然这是一个有限的解决方案,因为组件只能通过这种方式发送一个事件。)

我怀疑这个解决方案是原始的(好吧,我们姑且称之为事实吧),而且我忽略了一些更好的东西。

【问题讨论】:

  • 您是否正在寻找与事件关联的类型?我想你也可以发送“”。 _eventAggregator.PublishOnUIThread("");
  • 是的,我希望事件能够以某种方式被识别,并以不需要在接收中进行额外“if”检查的方式实现 IHandle 和 Handle()类(例如,他们没有收到对他们无用的事件)。如果我可以使用事件的发送者,那在这个小项目中将是完美的。也许我应该尝试用额外的功能来装饰 EventAggregator 类?

标签: c# caliburn.micro eventaggregator


【解决方案1】:

只需创建一个包含您想要的所有可能信号的枚举:

public enum ProjectSignals
{
    Connected,
    Disconnected,
    Openned
}

那么就

_eventAggregator.PublishOnUIThread( ProjectSignals.Connected );

class SomeClass : IHandle<ProjectSignals>
{
   public void Handle( ProjectSignals signal )
   {
        switch (signal)
        {
            case Connected:
                break;
        }
    }
}

【讨论】:

  • 谢谢!你认为我能以某种方式避免这种转变吗? (并且只收到例如 ProjectSignals.Connected。)我肯定会支持你的答案,但我今天的选票用完了。 :)
  • 不是直接的。发布基于对象的类型。您可以为每个要捕获的事物创建一个枚举。一个用于连接,一个用于断开连接,依此类推。
  • 是的,这绝对是可行的,但与空类类似,空枚举看起来有点奇怪;我希望有一些“感觉正确”的东西。不确定在这种情况下这是否是正确的态度。 :)
  • 我猜使用枚举的重点是它的重量更轻,内存压力略小。
  • 是的,你是对的。如果可以的话,我现在就让它保持打开状态;也许我可以找到或想出一些可以巧妙地解决它的 EventAggregator 类的装饰。但我明天肯定会回来投票。
猜你喜欢
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
相关资源
最近更新 更多