发送者:通道工厂
发送者使用通道工厂来创建通道。它们和通道侦听器的许多特性相似,但是 不同的是它们驻留在发送者内部,而且不需要从连接上侦听消息。它们会通过 CreateChannel方法创建符合要求的连接通道而不是消极等待消息到来。和通道 侦听器一样,通道工厂也是根据它们创建的通道功能来分类的。
实际上,这意味着每个传输通道都会有一个与之关联的通道工厂,比如支持 WS-*协议的通道。和通道侦听器一样,用户代码无法直接实例化通道工厂,需要 借助于Binding(你会在第8章里看到详细的介绍)。通道工厂类型都继承自 ChannelManagerBase。而类型层次的其它部分则不相同。本节里,我们会先研究 一下通道工厂里不同的类型,然后会创建一个自定义通道工厂来继续学习我们的 DelegatorChannel例子。
IChannelFactory接口
所有的通道工厂都继承了IChannelFactory接口。这个接口实现了 ICommunicationObject接口,因此可以强制它的继承者实现通道状态机。当然还 有就是暴露与通道和通道侦听器里类似的一个查询机制。代码如下所示:
public interface IChannelFactory : ICommunicationObject {
T GetProperty<T>() where T: class;
}
IChannelFactory<TChannel>接口
所有的通道工厂也都实现了IChannelFactory<TChannel>接口。这个接 口继承自IChannelFactory,所以它比IChannelFactory的用处更广。 IChannelFactory<TChannel>定义了2个成员,如下所示:
public interface IChannelFactory<TChannel> : IChannelFactory {
TChannel CreateChannel(EndpointAddress to);
TChannel CreateChannel(EndpointAddress to, Uri via);
}
CreateChannel方法包含2个参数。它们是EndpointAddress和Uri类型。在运 行时,这些参数会序列化到消息里,via参数就是通道要尝试连接的地址,to是 发送消息的地址。中间可能经过消息的中转(第2章里曾经讲到)。
ChannelFactoryBase类型
通道工厂简介继承了抽象类型ChannelFactoryBase。概念上,它的作用与通 道侦听器里使用的ChannelListenerBase类型一样。换句话说, ChannelListenerBase类型也提供了一种自定义打开、关闭、发送和接受消息超 时属性的方式。它的对象模型如下所示:
public abstract class ChannelFactoryBase : ChannelManagerBase,
IChannelFactory {
protected ChannelFactoryBase();
protected ChannelFactoryBase(IDefaultCommunicationTimeouts timeouts);
// IChannelFactory implementation
public virtual T GetProperty<T>() where T: class;
// CommunicationObject implementation
protected override void OnAbort();
protected override IAsyncResult OnBeginClose(TimeSpan timeout,
AsyncCallback callback,
Object state);
protected override void OnClose(TimeSpan timeout);
protected override void OnEndClose(IAsyncResult result);
protected override TimeSpan DefaultCloseTimeout { get; }
protected override TimeSpan DefaultOpenTimeout { get; }
// ChannelManagerBase implementation
protected override TimeSpan DefaultReceiveTimeout { get; }
protected override TimeSpan DefaultSendTimeout { get; }
}