为什么WCF服务契约接口的对象可以转换为IClientChannel

时间:2014-09-28 07:04:06

标签: c# wcf channelfactory

WCF Client Architecture中,它说

  

将ChannelFactory类与服务合约接口一起使用时,必须强制转换为IClientChannel接口以显式打开,关闭或中止通道

所以你创建并使用这样的客户端通道对象:

var cf = new ChannelFactory<ICalculator>(binding, ea);

var channel = cf.CreateChannel();
double result = channel.Add(5.2, 3.5);
Console.WriteLine(channel.GetType()); // outputs ICalculator
Console.WriteLine(result);

((IClientChannel)channel).Close();

这里有两件事困扰我。

  1. CreateChannel的方法签名以及第一个标准输出,表示通道变量属于ICalculator类型,如何将其转换为IClientChannel
  2. CreateChannel返回的对象应该是实现任何接口的某种类型的对象,channel.GetType()应该返回那个确切的类型,为什么它返回一个接口类型?

1 个答案:

答案 0 :(得分:4)

我最近正在研究同样的事情,因为我试图找出为什么我可以将我的频道作为ICommunicationObject投射,因为我看到了一些WCF源代码。

基本上.NET具有运行时所需的类型信息。

让我们说我们有一个实现接口的类

class Foo: IFoo {}

你可以像这样声明对象

IFoo instance = new Foo()

但您也可以直接将实例强制转换为Foo()

Foo cast = (Foo)instance;

因为对象可以在运行时转换或转换为其类型。


那么WCF在做什么?

为了好玩,尝试使用您自己的界面实例化通道工厂

IFoo instance = new ChannelFactory<IFoo>()

您将获得运行时异常。

&#34; InvalidOperationException异常 尝试获取IFoo的合同类型,但该类型不是ServiceContract,也不是 继承ServiceContract。&#34;

当您使用[ServiceContract]属性修饰接口时,WCF运行时会选择它并构建WCF构建频道所需的所有类。

这包括ICommunicationObject,IChannelFactory&lt; TChannel&gt;,IClientChannel等接口。

因此,虽然工厂方法将您的实例公开为IFoo,但在运行时它还具有WCF需要运行的其他接口。


最后,channel.GetType()返回ICalculatory的原因是因为GetType()返回该对象的运行时类型。通过强制转换为IClientChannel,您正在执行WCF保证将成功的类型转换。

相关问题