使用Publish/Subscribe 设计模式达到对象间数据同步(二)

博客介绍了注册处理时为subscriber分配独特标记用于event channel标识和索引,推荐用GUID产生标识符。还讲述使用目录菜单创建frmList窗口实例,窗体产生数据更新事件通过event channel发送,阻挡多余事件,最后所有subscribers接收事件并改变ListView项目。

在注册处理期间,subscriber被分配一个独特的标记,用来在event channel中标识subscriberevent channel也使用这个标记索引那些subscriber 虽然样品应用作为标记目标的杂乱脉冲干扰电码使用,我推荐在你的自己的程序里使用另一个方法产生一个独特的标识符 ( 例如产生一GUID)

使用目录菜单建立34frmList窗口实例。使用新的目录菜单选项创作frmList 3 或者4 个实例,然后在其中一个窗口中选择一个条目,双击这个条目进入可编辑模式,键入一个新的名字。窗体建立一个描述数据更新的事件并通过event channel发送。

Private Sub lvwList_AfterLabelEdit(ByVal sender As _ Object,
 
 ByVal e As _ System.Windows.Forms.LabelEditEventArgs) _
Handles lvwList.AfterLabelEdit
  Dim objEvent As clsDataEvent
  If e.Label <> "" Then
    objEvent = New clsDataEvent()
    With objEvent
      .Name = "NameChanged"
      .Value = e.Label
      .ExtraData = lvwList.Items(e.Item).Tag
      .Origin = Me
    End With
    MyBase.EventChannel.PublishEvent(objEvent)
  End If
End Sub

发送事件的窗体证实它是事件的创始人;并将clsDataEvent类的Origin属性设置为它自己。这样可以阻挡其他多余的事件,以确保发送者接收到的事件都是已经发布过的。最后,事件的发布者注意到了数据的改变。

所有的subscribers将收到事件。在EventApp 中,每个frmList 的实例将收到事件并且改变每个ListView中的发生变化的项目:

Public Overrides Sub EventRaise( _ ByVal  NewEvent As _
  EventApp.clsEvent)
  Dim objListItem As ListViewItem
 
  Select Case NewEvent.Name
    Case "NameChanged"
      For Each objListItem In lvwList.Items
        If objListItem.Tag = NewEvent.ExtraData Then
          objListItem.Text = NewEvent.Value
        End If
      Next
    Case Else
      'Handle other events
  End Select
End Sub
 
       这种事件系统类型将给你带来很大的灵活性。你可以使在应用程序中的任何一个
对象发布事件,只有那些对此感兴趣的对象的到更新的信息。也可以改变Event 
Channel类的实现方式, 如可以通过使用Web service或者消息系统(MS 
Message Queue 或者 IBM MQ 系列),通过 HTTP协发送事件。

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值