【发布时间】:2017-04-06 22:54:18
【问题描述】:
我发现 articles about 和 solutions 是关于这个与 Prism 相关的问题,但我没有找到任何与 Caliburn Micro 相关的信息。我检查了 所有 标记为 Caliburn.Micro 和 EventAggregator 的问题,但没有找到任何关于这个看似基本问题的 Caliburn 特定内容。
场景:我想向EventAggregator 发布没有任何信息的事件,除了发出发生某事的信号。
问题:首先,在 Caliburn Micro 中,EventAggregator 的 Publish() 方法需要发送一个类型的实例。其次,订阅和处理事件需要实现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<T>的实现来处理事件:
IHandle<Signal<SignalSourceClass>>
这样我可以通过只创建一个Signal 类来发送和接收“空”事件。 (当然这是一个有限的解决方案,因为组件只能通过这种方式发送一个事件。)
我怀疑这个解决方案是原始的(好吧,我们姑且称之为事实吧),而且我忽略了一些更好的东西。
【问题讨论】:
-
您是否正在寻找与事件关联的类型?我想你也可以发送“”。 _eventAggregator.PublishOnUIThread("");
-
是的,我希望事件能够以某种方式被识别,并以不需要在接收中进行额外“if”检查的方式实现 IHandle
和 Handle()类(例如,他们没有收到对他们无用的事件)。如果我可以使用事件的发送者,那在这个小项目中将是完美的。也许我应该尝试用额外的功能来装饰 EventAggregator 类?
标签: c# caliburn.micro eventaggregator