我正在研究ClientBase和ChannelFactory中使用的使用模式,有一点我无法理解。
在大多数示例中,我们都有此用法
public class MyClient : ClientBase<IMySvcContract>, IMySvcContract {
// IMySvcContract Interface method
public string MyOperation(int param)
{
return this.Channel.MyOperation(param);
}
}
这是客户端通过频道调用服务方法的示例。但是,当我仔细观察时,ClientBase
没有MyOperation()
的任何实现,它只知道IMySvcContract
中定义的公共接口。
因此,当调用this.Channel.MyOperation()
时,它实际运行的是哪个代码块? 它是否生成了在运行时实现TChannel的代码?如果是这样,这个模式怎么可能实现?“
编辑:在最简单的情况下,只有2个类具有ISvcContract
,Client
和Server
的实现。创建对象和类型转换为接口类型的模式没有意义,这是获取我所知道的实际代码的唯一可行方法。
编辑2:经过进一步研究,我现在了解到可以生成一个在运行时实现TChannel
接口的类。运行时代码生成到这个程度对我来说是新的。 Reference。结果,问题略有改变。
答案 0 :(得分:3)
ClientBase
将您的服务合同作为类型参数接收,并通过Channel
属性公开此类型的实例。
渠道本质上是服务通信层的代理。
此代理对象的实际生成发生在CLR的深处(而不是.NET Framework类库)。我不确定CLR是如何生成代理的,但它是非常低级的东西。
<强>更新强>
我通过通道工厂跟踪代码到RealProxy
类,System.Runtime.Remoting.RemotingServices
类(mscorlib)和实际完成工作的extern CreateTransparentProxy
方法。
我学到了一些发现,并且我分享了这些知识,因为.NET Framework中不存在“代码块”,这就是我所说的低级别。