WCF开发框架中有一种叫做WCF信道工厂的东西。对于刚刚接触WCF不久的朋友可能对其还不太了解。由于信道管理器在客户端和服务端所起的不同作用,分为信道监听器和信道工厂。#t#
和服务端的信道监听其相比,处于客户端的信道工厂显得简单。从名称就可以看得出来,WCF信道工厂的作用就是单纯的创建用于消息发送的信道。我们先来看看与信道工厂相关的一些接口和基类的定义。
一、WCF信道工厂相关的接口和基类
对于信道监听器,WCF定义了两个接口:IChannelListener和IChnnelListener< TChannel>。与之相对地,WCF也为信道工厂定义了两个接口:IChannelFactory和IChannelFactory< TChannel>。这两个接口定义了信道工厂最基本的功能和属性,下面是这两个接口的定义:
- 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); - }
由于WCF信道工厂的目的就是单纯的创建信道,所以IChannelFactory和IChannelFactory< TChannel>的定义显得格外简洁。两个重载的CreateChannel方法通过目的终结点的地址(to),以及在手工寻址下不同于目的终结点地址的另一个地址,该地址是消息实际会被发送的地址(via)。关于To和Via可以参考第二章关于物理地址和逻辑地址的部分。
除了上面的两个接口之外,WCF还定义分别是实现了它们的两个抽象基类:ChannelFactoryBase和ChannelFactoryBase< TChannel>。
ChannelFactoryBase继承自所有信道管理器的基类:CnannelManagerBase,而ChannelManagerBase又继承自CommunicationObject,实现ICommunicationObject接口定义的基本的状态属性和状态转换功能。并且实现了接口IChannelFactory和ICommunicationObject。而ChannelFactoryBase< TChannel>继承自CnannelManagerBase,并且实现了接口:IChannelFactory< TChannel>, IChannelFactory和ICommunicationObject。
一般地,范型类型TChannel为基于相应channel shape下客户端信道类型,比如IOutputChannel、IRequestChannel和IDuplexChannel。ChannelFactoryBase和ChannelFactoryBase< TChannel>的简单定义如下:
- public abstract class ChannelFactoryBase
: ChannelManagerBase, IChannelFactory,
ICommunicationObject- {
- ......
- }
- public abstract class ChannelFactoryBase
< TChannel> : ChannelFactoryBase, IChannel
Factory< TChannel>, IChannelFactory,
ICommunicationObject- {
- ......
- }
二、案例演示:如何自定义WCF信道工厂
在上一个案例中,我们创建了一个自定义的信道监听器:SimpleReplyChannelListner。该信道监听器用于在请求-回复消息交换模式下进行请求的监听。在本案例中,我们来创建与之相对的信道工厂:SimpleChannelFactory< TChannel>,用于请求-回复消息交换模式下进行用于请求发送信道的创建。由于SimpleChannelFactory< TChannel>的实现相对简单,将所有代码一并附上。
SimpleChannelFactory< TChannel>直接继承自抽象基类SimpleChannelFactoryBase< TChannel>。字段成员_innerChannelFactory表示信道工厂栈中后一个信道工厂对象,该成员在构造函数中通过传入的BindingContext对象的BuildInnerChannelFactory< TChannel>方法创建。
OnCreateChannel是核心大方法,实现了真正的信道创建过程,在这里我们创建了我们自定义的信道:SimpleRequestChannel.。构建SimpleRequestChannel. 的InnerChannel通过_innerChannelFactory的CreateChannel方法创建。对于其他的方法(OnOpen、OnBeginOpen和OnEndOpen),我们仅仅通过PrintHelper输出当前的方法名称,并调用_innerChannelFactory相应的方法。
- 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);
- }
- }