为了简单的模块间通信,出现了经典的.NET
事件,但现在有太多的事件,并且有事件链通过模块相互调用。Jon Skeet Singleton和EventAggregator
像Event_A
触发器Event_B
其中的火灾Event_C
。
的EventAggregator
是在一个模块中分离通信非常方便,所以我试图 小“乔恩斯基特辛格尔顿IV”在它的EventAggregator
打破那些event
链。 Jon Skeet on C# singletons can be found here
他说这是线程安全的,但他的例子只是暴露一个Singleton资源。
这里是我的代码
public static class GlobalEventAggregator
{
private static readonly IEventAggregator EventAggregator = new EventAggregator();
// tell C# compiler not to mark type as beforefieldinit
static GlobalEventAggregator()
{
}
public static void Subscribe(object instance)
{
EventAggregator.Subscribe(instance);
}
public static void Unsubscribe(object instance)
{
EventAggregator.Unsubscribe(instance);
}
public static void Publish(object message)
{
EventAggregator.Publish(message);
}
}
现在我可以每个模块中使用此GlobalEventAggregator
来发布事件和 所有其他模块,感兴趣的那些事件能够愉快地处理它们。 没有更多的链接。
但我会与多线程问题?其他模块有不同的线程,我想在其中发布事件。调度不应该是一个问题。 我应该在公共方法中使用lock
吗?
我不能告诉这些方法是否是线程安全的,并不能找到在该文档。
您可能想阅读本文。 [CSharpMessenger](http://wiki.unity3d.com/index.php?title=CSharpMessenger) –
我不是基于字符串的信使系统的粉丝,因为没有方便的方法来查找所有发布者或所有订阅者事件。使用强类型的消息,您可以轻松找到该类型的用法并获取所需的所有信息。请参阅Galasoft Messenger:http://blog.galasoft.ch/posts/2009/09/mvvm-light-toolkit-messenger-v2/ –
@ L.B感谢您的建议。认为以前有更多的人遇到过这种问题。也许那个Messanger比我自己的更好。 –