技术开发 频道

WPF中的发布-订阅服务(下)


管理持久订阅者


    如果我们要在运行时添加和移除持久订阅,可以使用例B-3所示的IPersistentSubscriptionService接口的方法,因为它们持久的本质,管理订阅最合适的方式就是通过某种管理工具。为了这一目的,IPersistentSubscriptionService定义了额外的操作,以支持对订阅者存储的各种查询。

    例B-8 IPersistentSubscriptionService接口
[DataContract] 
public struct PersistentSubscription
{
[DataMember]
public string Address;

[DataMember]
public string EventsContract;

[DataMember]
public string EventOperation;
}

[ServiceContract]
public interface IPersistentSubscriptionService
{
//管理操作
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
PersistentSubscription[] GetAllSubscribers( );

[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
PersistentSubscription[] GetSubscribersToContract(string eventsContract);

[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
string[] GetSubscribersToContractEventType(string eventsContract,
string eventOperation);
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
PersistentSubscription[] GetAllSubscribersFromAddress(string address);
//更多成员
}
    所有的这些管理操作都使用了一个简单的数据结构PersistentSubscription,它包含了订阅者的地址、契约和事件。
GetAllSubscribers()方法只是返回所有订阅者的列表。GetSubscribersToContract()方法则返回对应于特定契约的所有订阅者,而GetSubscribersToContractEventType()方法则返回对应于特定契约的特定事件操作的所有订阅者。最后,出于完整性的考虑,GetAllSubscribersFromAddress()根据提供的指定地址,返回符合条件的所有订阅者。我设计的发布-订阅框架包含了一个简单的持久订阅管理工具,名为持久订阅管理器(Persistent Subscription Manager),如图B-2所示。

  
    图B-2 持久订阅管理器应用程序

    管理工具使用IPersistentSubscriptionService添加和移除订阅。要添加新的订阅,需要为它提供事件契约定义的元数据交换地址。我们可以使用持久订阅者自己的元数据交换地址,也可以使用发布服务的元数据交换地址(例如例B-5中定义的发布服务),因为它们是多态的。在MEX地址文本框中输入元数据交换基地址,然后单击Lookup按钮。工具会以编码方式获取事件服务的元数据,生成Contract和Event组合框。我们可以使用第2章介绍的MetadataHelper获取元数据,解析它的内容。

    如果要订阅,则提供持久订阅者的地址,然后单击Subscribe按钮。持久订阅管理器会调用订阅服务(在实例中为MySubscriptionService服务)添加订阅。订阅服务的地址由持久订阅管理器的配置文件维护。

    发布-订阅模式同样可以解除系统安全的耦合。相对于多个订阅者以及多个潜在的安全机制,所有的发布者都需要针对一个单独的发布者认证它们自身。接着,订阅者只需要允许发布服务将它们传递给事件,而不是系统的所有发布者,因为发布者信任发布服务会对发布者进行妥善地授权与认证。对于发布服务而言,如果应用基于角色的安全机制,可以允许开发者在一个地方轻易地应用多个角色,以授权支持跨系统发布一个事件。

0
相关文章