Welcome

首页 / 软件开发 / WCF / 《WCF技术内幕》34:第2部分_第6章_通道:通道接口和基本类型

《WCF技术内幕》34:第2部分_第6章_通道:通道接口和基本类型2011-06-20 博客园 Frank Xu Lei译通道接口和基本类型

本章开始部分曾经提到过,学习WCF通道基础结构的一个关键部分就是了解 WCF系统在通道层使用的接口和类型。本节系统整理了这些复杂的类型系统,深 入浅出地讲述各个接口和类型的原理,使得读者可以更容易掌握这些知识点。

IChannel接口

System.ServiceModel.Channels.IChannel接口看似简单,但是它对于通道层 的实现至关重要。所有的通道和通道工厂必须实现它。换句话说,一个集成了 CommunicationObject的类型通常也会实现IChannel接口。在详细学习IChannel 接口的作用以前,我们先来看看它的基本结构:

public interface IChannel : ICommunicationObject {
T GetProperty<T>() where T: class;
}

你或许会问自己:“为什么会这么重要呢?”记得CommunicationObject堆栈 里的每个CommunicationObject 对象都有一些特定的功能,并且只有栈顶的通道 才可以被调用者调用。当堆栈组合正常的情况啊,GetProperty<T>方法提 供了在 CommunicationObject堆栈里查询特定功能的途径。例如,你也许想知道 CommunicationObject堆栈是否支持特定的通道外形,MessageVersion或安全功 能。下面代码演示了调用如何使用IChannel.GetProperty<T>方法:

// assume channel stack (myChannelStack) created假定通道 堆栈已经创建完毕
MessageVersion messageVersion =
myChannelStack.GetProperty<MessageVersion>();
if(MessageVersion != null){
// do something
}
// app continues

和CommunicationObject堆栈里的其它成员一样,当一个通道不知道如何响应 查询的时候,它会使用委托去调用堆栈里的下一个通道。GetProperty<T> 的简单实现如下:

public override T GetProperty<T>() where T: class {
if (typeof(T) == typeof(MessageVersion)) {
// this type knows only how to return MessageVersion
return (T) this.MessageVersion;
}
// no other capabalities are known here, so
// delegate the query to the next node
return this.inner.GetProperty<T>();
}

如上所示,这个GetProperty<T>方法的实现可以只返回 MessageVersion,并且它的可以调用查询堆栈里的下一个通道的功能。如果查询 的功能不存在,就会返回null,而不是抛出异常。因为使用了委托来嵌套查询, 所以只有最底层的通道查询方法才会抛出null。