积极答复者
道理何在?WCF下的观察者设计模式

问题
-
在看微软示例http://msdn.microsoft.com/zh-cn/library/ms752254.aspx时,想不通了
这个示例其实就是个观察者模式,微软命名是《设计模式:基于列表的发布-订阅》
设计思路比较简单,使用双工协定,有多个客户端,一个数据发布端,一个服务端
1、客户端首先订阅主题
2、数据发布端发送数据,使用事件最终调用客户端的方法
我的疑问:
1、首先看到服务实例化采用的是每会话形式,这意味着每启动一个客户端时都会在服务端生成一个服务实例来与客户端进行交互,
当启动数据发布端时,也同样会在服务端生成一个会话,这时由于数据发生变化,所以会触发事件,但是时间内部执行的应该是调用相应客户端的方法(每个服务实例应该有其自己的callback变量吧)
这里例子在微软示例程序中有,相应的路径是:根目录\WCF\Scenario\DesignPatterns\ListBasedPublishSubscribe
答案
全部回复
-
你好,
由于 InstanceContextMode设为PerSession,所以每个SampleService实例与客户端callback通道一一对应。
发布者客户端流程如下:
客户端调用PublishPriceChange方法 -> 触发SampleService静态事件 PriceChangeEvent
订阅者客户端流程如下:
客户端调用Subscribe方法 -> 注册SampleService静态事件 PriceChangeEvent
当事件被触发 -> 调用当前SampleServcie实例的事件Handler方法 -> 调用当前SampleService实例的callback通道PriceChange方法来通知客户端
Mog Liang -
你好,
由于 InstanceContextMode设为PerSession,所以每个SampleService实例与客户端callback通道一一对应。
发布者客户端流程如下:
客户端调用PublishPriceChange方法 -> 触发SampleService静态事件 PriceChangeEvent
订阅者客户端流程如下:
客户端调用Subscribe方法 -> 注册SampleService静态事件 PriceChangeEvent
当事件被触发 -> 调用当前SampleServcie实例的事件Handler方法 -> 调用当前SampleService实例的callback通道PriceChange方法来通知客户端
Mog Liang
首先,感谢您的回复
其次,继续疑问
既然每个客户端都会与服务端的每个实例建立一一对应的关系,那么也就是每个服务实例都会维护对某个客户端的通道,这个通道应该是仅限于与该客户端交互的吧?
这样的话,这个服务实例怎么能找到其他的客户端呢?
这也是我想问的?难道每一个服务实例都能与所有的其他客户端建立的通道进行通信吗?