CAB中我们使用Event Broker Service来处理不同Module之间的通信。这样的目的是为了保持各个业务模块之间的松耦合。当CAB加载一个Module的时候,它会遍历该模块中所有标记为EventPublications的事件和标记为EventSubscriptions的方法,将他们放入事件容器中,所有的EventTopic的实例都会放在WorkItem.EventTopics集合中。
Publish an Event
在CAB中,我们可以通过在一个Event前面添加一个EventPublication属性来发布一个事件。该属性(Attribute)有两个参数,一个是事件名,另外一个是事件发布的范围。这里我们有三种发布方式:
- PublicationScope.WorkItem,只对该WorkItem下有效
- PublicationScope.Descendants,对该WorkItem有效,同时对它子的WorkItem也有效
- PublicationScope.Global,对整个应用程序有效,对所有的WorkItem有效
下面的例子告诉我们如何发布一个全局有效的事件:
[EventPublication("event://UpdatesAvailable/New", PublicationScope.Global)]
public event SomeEventHandler UpdatesAvailable;
Subscribe an Event
同样,我们可以在一个方法前面添加EventSubscription属性来订阅一个事件(方法必须在事件发布范围之内)。不同的方法可以订阅同一个事件。在订阅事件的时候,我们可以指定该方法运行的线程规则,有三种可选的方案:
- ThreadOption.Background,系统会创建一个独立的后台线程运行该方法。
- ThreadOption.Publisher,该方法的执行和Publisher线程同步。
- ThreadOption.UserInterface,在当前激活的界面线程中执行。该选项可以保证编辑数据同时没有更新的数据。
下面的例子说明如何订阅一个事件,并其和当前界面同一线程处理:
[EventSubscription("event://UpdatesAvailable/New", Thread=ThreadOption.UserInterface)]
public void NewUpdates(object sender, SomeEventArgs numUpdates)
{
MessageBox.Show(numUpdates.ToString(), "Updates available");
}
Event Broker 的实现
在CAB中,Event Broker系统包含了下面几个类和接口:
- EventTopic,定义一个在Publisher和Subscriber之间的事件主题
- WorkItem,暴露一个EventTopics集合,它拥有一个注册EventTopic实例列表
- EventInspector,检查所有的对象或组件,看是否存在事件发布和订阅(EventPublication或EventSubscription属性)。如果有,将publications和subscriptions注册到EventTopic中,同时将EventTopic添加到WorkItem.EventTopics集合中。