SubscriptionManager<T>在泛型的静态字典对象m_TransientStore中存储了临时订阅者:
static Dictionary<string,List<T>> m_TransientStore;字典中包含了事件操作名以及以链表形式组成的所有订阅者。SubscriptionManager<T>的静态构造函数使用反射获得了回调契约(SubscriptionManager<T>的类型参数)的所有操作,并初始化了字典对象,让所有的操作都包含了一个空的链表。Subscribe()方法从操作调用的上下文中抽取出了回调引用。如果调用指定了一个操作名,Subscribe()方法会调用辅助方法AddTransient()。AddTransient()从存储中获取了事件的订阅者列表。如果列表没有包含该订阅者,则添加它。
如果调用者为操作名指定了空字符串或者null,Subsribe()方法则在回调契约中为每个操作调用AddTransient()方法。
Unsubscribe()方法的执行方式相似。注意,调用者能够订阅所有事件,然后取消其中一个的订阅。
管理持久订阅者
我所定义的IPersistentSubscriptionService接口可以管理持久订阅者,定义如例B-3所示。
例B-3 管理持久订阅者的IPersistentSubscriptionService接口
[ServiceContract]调用者若要添加一个持久订阅者,需要调用Subscribe()方法,调用时需要提供订阅者的地址、事件的契约名以及指定的事件操作自身。若要取消订阅,则可以提供相同的信息,然后调用Unsubscribe()方法。注意,IPersistentSubscriptionService接口并没有指定订阅者持久化在服务端的哪个地方,因为这属于实现细节。
public interface IPersistentSubscriptionService
{
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void Subscribe(string address,string eventsContract,string eventOperation);
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void Unsubscribe(string address,string eventsContract,string eventOperation);
//更多成员
}
之前介绍的类SubscriptionManager<T>同样可以实现IPersistentSubscriptionService接口的方法:
[BindingRequirement(TransactionFlowEnabled = true)]SubscriptionManager<T>在SQL Server中存储了持久订阅者。它的配置使用了Client/Service事务模式(参见第7章的内容),它要求该模式使用我编写的BindingRequirement特性。
public abstract class SubscriptionManager<T> where T : class
{
public void Unsubscribe(string address,string eventsContract,
string eventOperation);
public void Subscribe(string address,string eventsContract,
string eventOperation);
//更多成员
}
SubscriptionManager<T>的泛型类型参数为事件契约。注意,SubscriptionManager<T>并没有继承IPersistentSubscriptionService接口。应用程序需要公开它自己的持久订阅服务,但是不需要继承IPersistentSubscriptionService的新契约,因为它不需要回调引用。应用程序只需要继承SubscriptionManager<T>,并将事件契约指定为类型参数,同时继承IPersistentSubscriptionService接口。例如:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]MySubscriptionService类的实现无需编写任何代码,因为SubscriptionManager<T>已经实现了IPersistentSubscriptionService接口的方法。
class MySubscriptionService : SubscriptionManager<IMyEvents>,
IPersistentSubscriptionService
{}
注意,仅仅继承SubscriptionManager<IMyEvents>是不够的,因为它没有继承一个契约接口。我们必须添加对IPersistentSubscriptionService的实现,才可以支持持久订阅。
最后,应用程序需要定义一个IPersistentSubscriptionService的终结点:
<services>文章地址: http://www.qqread.com/aspdotnet/j397819.html进入讨论组讨论。
<service name = "MySubscriptionService">
<endpoint
address = "..."
binding = "..."
contract = "IPersistentSubscriptionService"
/>
</service>
</services>
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
- .NET开发人员犯的6大安全错误 (6次浏览)
- 请跟我来--使用Ext搞个原型 (1次浏览)
- ASP.NET 3.5 Extensions带来什么 (1次浏览)
- 应用WEB标准会使ScrollTop属性失效! (0次浏览)
- Cache用法之缓存页面和缓存数据 (0次浏览)
- 支持正则表达式的UrlMapping (0次浏览)
- 关于ASP.NET 2.0的目录结构变化 (0次浏览)
- WPF中Closing窗体时调用Hide()方法异常 (0次浏览)
- 对象数组根据某属性列的灵活排序 (0次浏览)
- DB2 9和ASP.NET 2.0构建下一代应用程序 (0次浏览)



