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

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

使用目录菜单建立 3 到 4 个 frmList 窗口实例。使用新的目录菜单选项创作 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协发送事件。
Published At
Categories with Web编程
Tagged with
comments powered by Disqus