gpt4 book ai didi

c# - 为什么可以将 WCF 服务契约接口(interface)的对象强制转换为 IClientChannel

转载 作者:行者123 更新时间:2023-11-30 20:47:09 26 4
gpt4 key购买 nike

WCF Client Architecture , 它说

When using the ChannelFactory class with a service contract interface, you must cast to the IClientChannel interface to explicitly open, close, or abort the channel

因此您可以像这样创建和使用客户端 channel 对象:

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的方法签名,以及第一个标准输出,表明 channel 变量是ICalculator类型,如何转换为IClientChannel?<
  2. CreateChannel 返回的对象应该是实现任何接口(interface)的某种类型的对象,并且 channel.GetType() 应该返回那个确切的类型,为什么它返回接口(interface)类型?

最佳答案

我最近在研究同样的事情,因为我试图弄清楚为什么我可以像我看到的一些 WCF 源代码那样将我的 channel 转换为 ICommunicationObject。

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

假设我们有一个实现接口(interface)的类

class Foo: IFoo {}

你可以这样声明对象

IFoo instance = new Foo()

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

Foo cast = (Foo)instance;

因为一个对象可以在运行时转换或转换成它的类型。


那么WCF在做什么呢?

为了好玩,尝试用你自己的接口(interface)实例化一个 channel 工厂

IFoo instance = new ChannelFactory<IFoo>()

你会得到一个运行时异常。

"无效操作异常尝试获取 IFoo 的契约(Contract)类型,但该类型不是 ServiceContract,也不是
继承一个 ServiceContract。”

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

这包括 ICommunicationObject、IChannelFactory 、IClientChannel 等接口(interface)

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


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

关于c# - 为什么可以将 WCF 服务契约接口(interface)的对象强制转换为 IClientChannel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26082494/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com