将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();
这里有两件事困扰我。
CreateChannel
的方法签名以及第一个标准输出,表示通道变量属于ICalculator类型,如何将其转换为IClientChannel
?CreateChannel
返回的对象应该是实现任何接口的某种类型的对象,channel.GetType()
应该返回那个确切的类型,为什么它返回一个接口类型?答案 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保证将成功的类型转换。