[WCF的Binding模型]之五:绑定元素(Binding Element)

本文深入探讨WCF中的绑定元素,解释它们如何构成绑定对象并创建信道栈。绑定元素负责创建信道,如传输、编码和协议信道,通过BuildChannelListener和BuildChannelFactory方法实现。通过自定义绑定元素SimpleBindingElement,展示了如何构建自定义的信道管理器。WCF的Binding是绑定元素的有序集合,其特性由这些元素及其顺序决定。创建自定义绑定SimpleBinding,包含HttpTransportBindingElement、TextMessageEncodingBindingElement和SimpleBindingElement。
摘要由CSDN通过智能技术生成

在上面的内容中,先后介绍了信道、信道管理器、信道监听器和信道工厂。从对象的创建来讲,信道管理器是信道的创建者。说的再具体点,客户端的信道通过信道工厂创建,服务端的信道通过信道监听器创建。但是信道工厂和信道监听器又是如果被创建出来的呢?

我们在一开始就已经说过,作为终结点三要素的绑定对象实现了所有的通信细节,并且通过创建信道栈实现了消息的传递。从这一点来说,绑定对象无疑是信道层所有通信对象的最终缔造者,所以信道工厂和信道监听器最终的创建都是靠绑定对象实现的。关于这个创建过程又和另一个重要的对象密切相关,那就是绑定元素。

绑定元素,顾名思义就是构成一个绑定对象的元素。绑定对象最根本的目的就是创建信道栈,借此实现对消息的传输、编码和基于消息交换的其他功能,比如安全、可靠传输、事务流转等等。组成信道栈的单个信道对象基于对某项单一功能的实现,在不同环境中,我们需要根据具体的需要创建相应的信道,并根据一定的顺序把这些信道组成一个完整的信道栈。对于绑定对象来说,如何实现这种灵活、自由的信道常创建方式,这得益于基于绑定元素的设计模式。

一、 关于绑定元素

从结构的角度讲,一个绑定对象有一系列绑定元素组成,每个绑定元素负责创建相应的信道。所以绑定元素几何的构成以及它们之间的先后顺序,决定了最终生成的信道栈中的信道组成已经它们位于栈中的先后顺序。WCF之所以在设计的时候将绑定和绑定元素分离开发,是基于灵活性、可扩展性考虑的。

在介绍信道和信道栈的时候我们说过,我们不可能、也不应该创建一个万能的信道能够提供消息交换中的所有的功能,所以我们让一个信道只承载某个单一的功能,比如传输信道专注于网络传输,消息编码信到专注于消息的编码,WCF还定义了一一系列的信道,他们分别关注与安全、可靠传输和事务流转等等。这种信道组合的设计方式使得我们可以根据具体的需求来定制我们将要创建的信道栈,让它只具有我们必须的功能,而去除不必要的功能。

同理,我们可以根据具体实际需求,将必要的绑定元素进行有序的组合,从而创建最能适合具体场景的绑定对象。由于信道可以分为必须的传输信道、消息编码信道和可选的基于某种WS-*协议实现的协议信道,与之相对地,我们的绑定元素可以分为传输绑定元素、消息编码绑定元素和协议绑定元素。

由于信道的实际创建者是信道管理器(信道工厂和信道监听器),所以绑定元素只需要实现对信道管理器的创建,而最终实现对具体信道的创建。所以绑定元素的最根本的功能就是实现对信道监听器和信道工厂的创建。这可以从所有绑定元素的基类, System.ServiceModel.Channels.BindingElement的定义上看出来:

   1: public abstract class BindingElement
   2: {
   
   3:     // Methods
   4:     protected BindingElement();
   5:     protected BindingElement(BindingElement elementToBeCloned);
   6:  
   7:     public virtual IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context);
   8:     public virtual IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context) where TChannel : class, IChannel;
   9:     public virtual bool CanBuildChannelFactory<TChannel>(BindingContext context);
  10:     public virtual bool CanBuildChannelListener<TChannel>(BindingContext context) where TChannel : class, IChannel;
  11:     public abstract BindingElement Clone();
  12:     public abstract T GetProperty<T>(BindingContext context) where T : class;
  13: }

BindingElement的核心方法成员有两个:BuildChannelListener<TChannel>和BuildChannelFactory<TChannel〉,用于创建相应的信道监听器和信道工厂。两个Build方法的参数都是BindingContext,关于BindingContext,我将在本章后续的部分中介绍。而CanBuildChannelFactory<TChannel>和CanBuildChannelListener<TChannel〉 则属性两个测试性质的方法,用于检验相应的相应的信道监听器和信道功能是否可以被创建。

二、 案例演示:如何自定义绑定元素

接下来,我们通过一个案例来演示如果自定义一个绑定元素。通过该绑定元素来创建我们在上面一个案例中创建的两个自定义信道管理器:SimpleChannelFactory和SimpleChannelListener。按照上面的命名方式,我们把这个自定义绑定元素命名为:SimpleBindingElement,下面是整个SimpleBindingElement的定义:

   1: public class SimpleBindingElement : BindingElement
   2: {
   
   3:     public SimpleBindingElement()
   4:     {
   
   5:         PrintHelper.Print(this, "SimpleBindingElement");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值