频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

WCF中的发布-订阅服务

来源:qqread 作者:佚名 出处:巧巧读书 2008-02-22 进入讨论组
上一页 1 2 3 4 5 6 下一页 

     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] 
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);
//更多成员
}
   调用者若要添加一个持久订阅者,需要调用Subscribe()方法,调用时需要提供订阅者的地址、事件的契约名以及指定的事件操作自身。若要取消订阅,则可以提供相同的信息,然后调用Unsubscribe()方法。注意,IPersistentSubscriptionService接口并没有指定订阅者持久化在服务端的哪个地方,因为这属于实现细节。

   之前介绍的类SubscriptionManager<T>同样可以实现IPersistentSubscriptionService接口的方法:

[BindingRequirement(TransactionFlowEnabled = true)] 
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>在SQL Server中存储了持久订阅者。它的配置使用了Client/Service事务模式(参见第7章的内容),它要求该模式使用我编写的BindingRequirement特性。

   SubscriptionManager<T>的泛型类型参数为事件契约。注意,SubscriptionManager<T>并没有继承IPersistentSubscriptionService接口。应用程序需要公开它自己的持久订阅服务,但是不需要继承IPersistentSubscriptionService的新契约,因为它不需要回调引用。应用程序只需要继承SubscriptionManager<T>,并将事件契约指定为类型参数,同时继承IPersistentSubscriptionService接口。例如:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
class MySubscriptionService : SubscriptionManager<IMyEvents>,
IPersistentSubscriptionService
{}
   MySubscriptionService类的实现无需编写任何代码,因为SubscriptionManager<T>已经实现了IPersistentSubscriptionService接口的方法。

   注意,仅仅继承SubscriptionManager<IMyEvents>是不够的,因为它没有继承一个契约接口。我们必须添加对IPersistentSubscriptionService的实现,才可以支持持久订阅。

   最后,应用程序需要定义一个IPersistentSubscriptionService的终结点:

<services> 
<service name = "MySubscriptionService">
<endpoint
address = "..."
binding = "..."
contract = "IPersistentSubscriptionService"
/>
</service>
</services>
文章地址: http://www.qqread.com/aspdotnet/j397819.html进入讨论组讨论。
上一页 1 2 3 4 5 6 下一页 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章