艾伟:[WCF的Binding模型]之四:信道工厂(Channel Factory)

简介: 由于信道管理器在客户端和服务端所起的不同作用,分为信道监听器和信道工厂。和服务端的信道监听其相比,处于客户端的信道工厂显得简单。从名称就可以看得出来,信道工厂的作用就是单纯的创建用于消息发送的信道。我们先来看看与信道工厂相关的一些接口和基类的定义。

由于信道管理器在客户端和服务端所起的不同作用,分为信道监听器和信道工厂。和服务端的信道监听其相比,处于客户端的信道工厂显得简单。从名称就可以看得出来,信道工厂的作用就是单纯的创建用于消息发送的信道。我们先来看看与信道工厂相关的一些接口和基类的定义。

一、信道工厂相关的接口和基类

对于信道监听器,WCF定义了两个接口:IChannelListener和IChnnelListener。与之相对地,WCF也为信道工厂定义了两个接口:IChannelFactory和IChannelFactory。这两个接口定义了信道工厂最基本的功能和属性,下面是这两个接口的定义:

  public interface IChannelFactory : ICommunicationObject
{

// Methods

T GetProperty
<T>() where T : class;

}

public interface IChannelFactory<TChannel> : IChannelFactory, ICommunicationObject
{

// Methods

TChannel CreateChannel(EndpointAddress to);

TChannel CreateChannel(EndpointAddress to, Uri via);

}

 

由于信道工厂的目的就是单纯的创建信道,所以IChannelFactory和IChannelFactory的定义显得格外简洁。两个重载的CreateChannel方法通过目的终结点的地址(to),以及在手工寻址下不同于目的终结点地址的另一个地址,该地址是消息实际会被发送的地址(via)。关于To和Via可以参考第二章关于物理地址和逻辑地址的部分。

除了上面的两个接口之外,WCF还定义分别是实现了它们的两个抽象基类:ChannelFactoryBase和ChannelFactoryBase。ChannelFactoryBase继承自所有信道管理器的基类:CnannelManagerBase,而ChannelManagerBase又继承自CommunicationObject,实现ICommunicationObject接口定义的基本的状态属性和状态转换功能。并且实现了接口IChannelFactory和ICommunicationObject。而ChannelFactoryBase继承自CnannelManagerBase,并且实现了接口:IChannelFactory, IChannelFactory和ICommunicationObject。一般地,范型类型TChannel为基于相应channel shape下客户端信道类型,比如IOutputChannel、IRequestChannel和IDuplexChannel。ChannelFactoryBase和ChannelFactoryBase的简单定义如下:

  public abstract class ChannelFactoryBase : ChannelManagerBase, IChannelFactory, 
ICommunicationObject
{

}

public abstract class ChannelFactoryBase<TChannel> : ChannelFactoryBase,
IChannelFactory
<TChannel>, IChannelFactory, ICommunicationObject
{

}

 

下面的类图简明直观的表述了WCF中关于信道工厂的体系结构。

image

二、案例演示:如何自定义信道工厂

在上一个案例中,我们创建了一个自定义的信道监听器:SimpleReplyChannelListner。该信道监听器用于在请求-回复消息交换模式下进行请求的监听。在本案例中,我们来创建与之相对的信道工厂:SimpleChannelFactory,用于请求-回复消息交换模式下进行用于请求发送信道的创建。由于SimpleChannelFactory的实现相对简单,将所有代码一并附上。

SimpleChannelFactory直接继承自抽象基类SimpleChannelFactoryBase。字段成员_innerChannelFactory表示信道工厂栈中后一个信道工厂对象,该成员在构造函数中通过传入的BindingContext对象的BuildInnerChannelFactory方法创建。OnCreateChannel是核心大方法,实现了真正的信道创建过程,在这里我们创建了我们自定义的信道:SimpleRequestChannel.。构建SimpleRequestChannel. 的InnerChannel通过­­­_innerChannelFactory的CreateChannel方法创建。对于其他的方法(OnOpen、OnBeginOpen和OnEndOpen),我们仅仅通过PrintHelper输出当前的方法名称,并调用­_innerChannelFactory相应的方法。

SimpleChannelFactory
public class SimpleChannelFactory<TChannel> : ChannelFactoryBase<TChannel>
{
public IChannelFactory<TChannel> _innerChannelFactory;

public SimpleChannelFactory(BindingContext context)
{
PrintHelper.Print(
this, "SimpleChannelFactory");
this._innerChannelFactory = context.BuildInnerChannelFactory<TChannel>();
}
protected override TChannel OnCreateChannel(EndpointAddress address, Uri via)
{
PrintHelper.Print(
this, "OnCreateChannel");
IRequestChannel innerChannel
= this._innerChannelFactory.CreateChannel(address, via) as IRequestChannel;
SimpleRequestChannel. channel
= new SimpleRequestChannel.(this, innerChannel);
return (TChannel)(object)channel;
}
protected override IAsyncResult OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state)
{
PrintHelper.Print(
this, "OnBeginOpen");
return this._innerChannelFactory.BeginOpen(timeout, callback, state);
}
protected override void OnEndOpen(IAsyncResult result)
{
PrintHelper.Print(
this, "OnEndOpen");
this._innerChannelFactory.EndOpen(result);
}
protected override void OnOpen(TimeSpan timeout)
{
PrintHelper.Print(
this, "OnOpen");
this._innerChannelFactory.Open(timeout);
}
}

 

WCF中的绑定模型:
[WCF中的Binding模型]之一: Binding模型简介
[WCF中的Binding模型]之二: 信道与信道栈(Channel and Channel Stack)
[WCF中的Binding模型]之三:信道监听器(Channel Listener)
[WCF中的Binding模型]之四:信道工厂(Channel Factory)
[WCF中的Binding模型]之五:绑定元素(Binding Element)
[WCF中的Binding模型]之六:从绑定元素认识系统预定义绑定

目录
相关文章
|
XML 开发者 网络架构
|
网络协议 网络架构 Windows
跟着Artech学习WCF扩展(1) Binding进行通信
这个demo简单 就一个服务器段的一个客户端的 主要是注释 Server的 using System; using System.Collections.Generic; using System.
713 0
|
安全 网络架构
消息(7)——WCF编程模型中控制消息(1)绑定,契约
WCF服务要通过终结点来进行通信,终结点三大构成元素:ABC,其中的B,binding是重中之重,它解决了在消息交换过程中的编码,传输协议,安全等问题。 绑定是分层的,一个绑定对象对应一组有序的绑定元素的集合。
768 0
|
安全 数据格式 XML
WCF—Binding
Binding描述了哪些层面的信息 一个Binding包含着丰富的信息,每种信息都描述了服务端和客户端交互过程中的一方面,如下表所示,Binding描述了这些层面的信息: 层次 备注说明 Transactions(事务) TransactionF...
713 0