首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Dotnet频道
中国IT教育
Google
首页 ASP.NET  C#  XML/WebService ADO.NET VC.NET VB.NET .NET 资讯动态 专题 RSS订阅 讨论 下载
您现在的位置: 中国IT实验室 >> Dotnet >> XMLWeb >> 正文

WCF中的发布-订阅服务

 
 
     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>
 

上一页  [1] [2] [3] [4] [5] [6] 下一页

【责编:Zenghui】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 社区讨论
 博客论点
 Dotnet频道相关导航