none
道理何在?WCF下的观察者设计模式 RRS feed

  • 问题

  • 在看微软示例http://msdn.microsoft.com/zh-cn/library/ms752254.aspx时,想不通了
    这个示例其实就是个观察者模式,微软命名是《设计模式:基于列表的发布-订阅》
    设计思路比较简单,使用双工协定,有多个客户端,一个数据发布端,一个服务端
    1、客户端首先订阅主题
    2、数据发布端发送数据,使用事件最终调用客户端的方法

    我的疑问:
    1、首先看到服务实例化采用的是每会话形式,这意味着每启动一个客户端时都会在服务端生成一个服务实例来与客户端进行交互,
         当启动数据发布端时,也同样会在服务端生成一个会话,这时由于数据发生变化,所以会触发事件,但是时间内部执行的应该是调用相应客户端的方法(每个服务实例应该有其自己的callback变量吧)

    这里例子在微软示例程序中有,相应的路径是:根目录\WCF\Scenario\DesignPatterns\ListBasedPublishSubscribe

    2010年1月22日 7:26

答案

全部回复

  • 顶。。。
    2010年1月22日 21:28
  • 为啥子没人回答呢?
    伤心的眼泪。。。
    2010年1月25日 7:21
  • 你好,

    由于 InstanceContextMode设为PerSession,所以每个SampleService实例与客户端callback通道一一对应。

    发布者客户端流程如下:
    客户端调用PublishPriceChange方法 -> 触发SampleService静态事件 PriceChangeEvent

    订阅者客户端流程如下:
    客户端调用Subscribe方法 -> 注册SampleService静态事件 PriceChangeEvent 
                                                         当事件被触发 -> 调用当前SampleServcie实例的事件Handler方法 -> 调用当前SampleService实例的callback通道PriceChange方法来通知客户端


    Mog Liang
    2010年1月26日 2:09
  • 你好,

    由于 InstanceContextMode设为PerSession,所以每个SampleService实例与客户端callback通道一一对应。

    发布者客户端流程如下:
    客户端调用PublishPriceChange方法 -> 触发SampleService静态事件 PriceChangeEvent

    订阅者客户端流程如下:
    客户端调用Subscribe方法 -> 注册SampleService静态事件 PriceChangeEvent 
                                                         当事件被触发 -> 调用当前SampleServcie实例的事件Handler方法 -> 调用当前SampleService实例的callback通道PriceChange方法来通知客户端


    Mog Liang

    首先,感谢您的回复

    其次,继续疑问
        既然每个客户端都会与服务端的每个实例建立一一对应的关系,那么也就是每个服务实例都会维护对某个客户端的通道,这个通道应该是仅限于与该客户端交互的吧?
        这样的话,这个服务实例怎么能找到其他的客户端呢?

        这也是我想问的?难道每一个服务实例都能与所有的其他客户端建立的通道进行通信吗?

      
    2010年1月27日 2:49
  • 他们通过静态事件来传递消息,比较神奇。我也第一次遇见这种用法。


    Mog Liang
    • 已标记为答案 金靓 2010年1月28日 1:16
    2010年1月27日 7:09
  • 他们通过静态事件来传递消息,比较神奇。我也第一次遇见这种用法。


    Mog Liang

    还真没见过这么用事件的,的确很独特,这下子明白了
    • 已标记为答案 金靓 2010年1月28日 1:16
    • 取消答案标记 金靓 2010年1月28日 1:16
    2010年1月28日 1:15